以编程方式在自定义 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 然后它起作用了,数据库连接改变了,包也起作用了!可能我没有完全理解这个问题。但对我来说,诀窍是找到一种能够改变表达式的方法。现在我有一个解决方案!