以编程方式在自定义 SSIS 组件上设置 属性 表达式
Programmatically set property expressions on custom SSIS component
我已经为我的 SSIS 包创建了一个自定义组件,并希望它尝试 auto-link 一些变量。目前我通过 UI Properties->Misc->Expressions->(选择 属性 名称和表达式 link 手动 linking 它们,作为如下所示:
我目前正在努力处理以下代码:
public override void InitializeTask(Connections connections, VariableDispenser variableDispenser, IDTSInfoEvents events, IDTSLogging log, EventInfos eventInfos, LogEntryInfos logEntryInfos, ObjectReferenceTracker refTracker)
{
base.InitializeTask(connections, variableDispenser, events, log, eventInfos, logEntryInfos, refTracker);
using (Package pkg = ... /*not sure how to get 'this' package*/)
{
// Iterate through executables to try to find this TaskHost.
foreach (Executable pExec in pkg.Executables)
{
TaskHost aTaskHost = (TaskHost)pExec;
if (aTaskHost.InnerObject.GetType() == this.GetType())
{
// Iterate over variables, to try to match some task's properties.
foreach (Variable myVar in pkg.Variables)
{
if (aTaskHost.Properties.Contains("PackageName") &&
Regex.IsMatch(myVar.QualifiedName, "PackageName", RegexOptions.IgnoreCase))
{
aTaskHost.SetExpression("PackageName", myVar.Expression);
}
}
break;
}
}
}
}
我正在尝试一直往下设置表达水平;我的其他一些变量可能会改变,所以我不想 linking a .Value,而是想转到 .Expression。
但是,我不确定如何获取当前包,或者即使我获取了它,一切都会 link 正常。所以,我想知道是否有人在自定义组件的初始化时以编程方式 link 将系统变量编辑为自定义组件的 属性 表达式。
据我所知,无法通过 UI 属性来完成此操作。但是,如果通过 SSIS UI 连接,则它可以工作。下面的片段是我采用的方法。希望它可以帮助其他想要更多地处理自定义组件的人。
所以如果你有以下 SSIS UI class:
class PackageStatusSSISUI : Microsoft.SqlServer.Dts.Runtime.Design.IDtsTaskUI
{
private TaskHost _taskHost;
private IServiceProvider _serviceProvider;
public System.Windows.Forms.ContainerControl GetView()
{
PackageStatusForm editor = new PackageStatusForm(this._taskHost, this._serviceProvider);
return editor;
}
public void Initialize(TaskHost taskHost, IServiceProvider serviceProvider)
{
this._taskHost = taskHost;
this._serviceProvider = serviceProvider;
}
}
然后如果windows表格连接到它,你可以访问任务主机变量和设置表达式:
public partial class PackageStatusForm : Form
{
public PackageStatusForm(TaskHost taskHost, IServiceProvider serviceprovider)
{
this.TaskHost = taskHost;
this.ServiceProvider = serviceprovider;
InitializeComponent();
if (this.TaskHost != null && this.TaskHost.Variables != null)
{
// Goes though each variable, to display the shortcut
foreach (Variable var in taskHost.Variables)
{
variableList.Items.Add(var.QualifiedName);
}
// Can set labels to variable name, text boxes to allow the expressions, etc
foreach (LabelTextDisplay ppt in this.flowLayoutPanel1.Controls)
{
this.TaskHost.SetExpression(ppt.PropertyName, ppt.ExpressionValue);
}
}
}
}
- “没有办法”,是不正确的。不要尝试更改值,而是更改变量的表达式(并保留 .EvaluateAsExpression = true。pkg.Variables["SrcConString"].Expression = "MyDbConnectionString"; 这很重要,因为看起来如果EvaluateAsExpression=false,那么更改ConnectionString的Expression不起作用,连接失败。(但是你可以更改Variable值。)但是如果把.EvaluateExpression = true,你修改variable.Expression 然后它起作用了,数据库连接改变了,包也起作用了!可能我没有完全理解这个问题。但对我来说,诀窍是找到一种能够改变表达式的方法。现在我有一个解决方案!
我已经为我的 SSIS 包创建了一个自定义组件,并希望它尝试 auto-link 一些变量。目前我通过 UI Properties->Misc->Expressions->(选择 属性 名称和表达式 link 手动 linking 它们,作为如下所示:
我目前正在努力处理以下代码:
public override void InitializeTask(Connections connections, VariableDispenser variableDispenser, IDTSInfoEvents events, IDTSLogging log, EventInfos eventInfos, LogEntryInfos logEntryInfos, ObjectReferenceTracker refTracker)
{
base.InitializeTask(connections, variableDispenser, events, log, eventInfos, logEntryInfos, refTracker);
using (Package pkg = ... /*not sure how to get 'this' package*/)
{
// Iterate through executables to try to find this TaskHost.
foreach (Executable pExec in pkg.Executables)
{
TaskHost aTaskHost = (TaskHost)pExec;
if (aTaskHost.InnerObject.GetType() == this.GetType())
{
// Iterate over variables, to try to match some task's properties.
foreach (Variable myVar in pkg.Variables)
{
if (aTaskHost.Properties.Contains("PackageName") &&
Regex.IsMatch(myVar.QualifiedName, "PackageName", RegexOptions.IgnoreCase))
{
aTaskHost.SetExpression("PackageName", myVar.Expression);
}
}
break;
}
}
}
}
我正在尝试一直往下设置表达水平;我的其他一些变量可能会改变,所以我不想 linking a .Value,而是想转到 .Expression。
但是,我不确定如何获取当前包,或者即使我获取了它,一切都会 link 正常。所以,我想知道是否有人在自定义组件的初始化时以编程方式 link 将系统变量编辑为自定义组件的 属性 表达式。
据我所知,无法通过 UI 属性来完成此操作。但是,如果通过 SSIS UI 连接,则它可以工作。下面的片段是我采用的方法。希望它可以帮助其他想要更多地处理自定义组件的人。
所以如果你有以下 SSIS UI class:
class PackageStatusSSISUI : Microsoft.SqlServer.Dts.Runtime.Design.IDtsTaskUI
{
private TaskHost _taskHost;
private IServiceProvider _serviceProvider;
public System.Windows.Forms.ContainerControl GetView()
{
PackageStatusForm editor = new PackageStatusForm(this._taskHost, this._serviceProvider);
return editor;
}
public void Initialize(TaskHost taskHost, IServiceProvider serviceProvider)
{
this._taskHost = taskHost;
this._serviceProvider = serviceProvider;
}
}
然后如果windows表格连接到它,你可以访问任务主机变量和设置表达式:
public partial class PackageStatusForm : Form
{
public PackageStatusForm(TaskHost taskHost, IServiceProvider serviceprovider)
{
this.TaskHost = taskHost;
this.ServiceProvider = serviceprovider;
InitializeComponent();
if (this.TaskHost != null && this.TaskHost.Variables != null)
{
// Goes though each variable, to display the shortcut
foreach (Variable var in taskHost.Variables)
{
variableList.Items.Add(var.QualifiedName);
}
// Can set labels to variable name, text boxes to allow the expressions, etc
foreach (LabelTextDisplay ppt in this.flowLayoutPanel1.Controls)
{
this.TaskHost.SetExpression(ppt.PropertyName, ppt.ExpressionValue);
}
}
}
}
- “没有办法”,是不正确的。不要尝试更改值,而是更改变量的表达式(并保留 .EvaluateAsExpression = true。pkg.Variables["SrcConString"].Expression = "MyDbConnectionString"; 这很重要,因为看起来如果EvaluateAsExpression=false,那么更改ConnectionString的Expression不起作用,连接失败。(但是你可以更改Variable值。)但是如果把.EvaluateExpression = true,你修改variable.Expression 然后它起作用了,数据库连接改变了,包也起作用了!可能我没有完全理解这个问题。但对我来说,诀窍是找到一种能够改变表达式的方法。现在我有一个解决方案!