Программно задать выражения свойств для пользовательского компонента SSIS

Я создал пользовательский компонент для своего пакета SSIS и хотел бы, чтобы он попытался автоматически связать некоторые переменные. В настоящее время я вручную связываю их через Свойства пользовательского интерфейса-> Разное-> Выражения-> (выбирая имя свойства и выражение для ссылки на него), как показано ниже:

введите здесь описание изображения

В настоящее время я борюсь со следующим кодом:

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;
            }
        }
    }
}

Я пытаюсь пройти весь путь вниз, чтобы установить уровень экспрессии; некоторые из моих других переменных могут измениться, поэтому вместо связывания .Value я хочу перейти к .Expression.

Однако я не уверен, как получить текущий пакет или, даже если я его получу, все будет правильно скомпоновано. Итак, мне интересно, программно ли кто-нибудь связал системную переменную с выражением свойства пользовательского компонента при его инициализации.


person Community    schedule 20.01.2015    source источник
comment
вы хотите использовать системную переменную или пользовательскую переменную?   -  person koushik veldanda    schedule 20.01.2015
comment
Оба, если можно. Некоторые системные переменные: имя пакета и время запуска. Другие пользовательские переменные представляют собой данные, извлеченные из файла во время выполнения.   -  person    schedule 20.01.2015


Ответы (1)


Я не видел способа сделать это через свойства пользовательского интерфейса. Однако при подключении через пользовательский интерфейс SSIS он может работать. Фрагменты ниже - это метод, который я использовал. Надеюсь, это может помочь кому-то еще, кто хочет больше возиться с пользовательскими компонентами.

Итак, если у вас есть следующий класс пользовательского интерфейса SSIS:

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;
    }
}

Затем, если окна формируются для подключения к нему, вы можете получить доступ к переменным хоста задачи и установить выражения:

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);
            }
        }
    }
}
person Community    schedule 17.02.2015