Как мне перехватить события из пакета служб SSIS, загруженного в C #?

У меня есть пакет служб SSIS, который выполняет несколько задач. Я вручную добавил обработчик событий в Business Intelligence Studio 2005 на уровне пакета для события OnExecStatusChanged.

У меня вопрос, как я могу добавить обработчик для этого события в C #? Я загрузил пакет, как указано здесь, и я также создал собственный класс, унаследованный от Microsoft.SqlServer.Dts.Runtime.DefaultEvents, который является моим «Слушателем»:

    Microsoft.SqlServer.Dts.Runtime.SqlPackageEventListener sqlListener = new SqlPackageEventListener();
    Microsoft.SqlServer.Dts.Runtime.Application sqlPackageLoader = new Application();
    Microsoft.SqlServer.Dts.Runtime.Package sqlPackage = sqlPackageLoader.LoadPackage(@"path\MigrateData.dtsx", sqlListener);
    sqlPackage.Execute(null, null, sqlListener, null, null);

Если я проверю свойство sqlPackage.EventHandlers.Count, я получу правильное число для обработчиков, добавленных в Business Intelligence Studio.

Есть ли способ обработать эти события внутри C #?

Спасибо.

11.12.2008 02:18:54
1 ОТВЕТ
РЕШЕНИЕ

Ну, я ничего не нашел, поэтому я придумал обходной путь, чтобы я автоматически отвечал мне:

Поскольку нет никакого способа напрямую перехватить события, создаваемые пакетом SSIS, я реализовал свои собственные события в моем слушателе :

public class SqlPackageEventListener : DefaultEvents
{
    public SqlPackageChangedHandler OnPackageError;

    public override bool OnError(DtsObject source, int errorCode, string subComponent, string description, string helpFile, int helpContext, string idofInterfaceWithError) {
        OnPackageError(this, new PackageErrorEventArgs(source, subComponent, description));
        return base.OnError(source, errorCode, subComponent, description, helpFile, helpContext, idofInterfaceWithError);
    }

    public delegate void SqlPackageChangedHandler(
        object sqlPackage,
        EventArgs packageInfo
        );
}

public class PackageErrorEventArgs : EventArgs 
{
    private DtsObject source;
    public DtsObject Source {
        get { return source; }
        set { source = value; }
    }

    private string subcomponent;
    public string Subcomponent {
        get { return subcomponent; }
        set { subcomponent = value; }
    }

    private string description;
    public string Description {
        get { return description; }
        set { description = value; }
    }

    public PackageErrorEventArgs(DtsObject source, string subcomponent, string description) {
        this.description = description;
        this.source = source;
        this.subcomponent = subcomponent;
    }
}

public class Test 
{
    SqlPackageEventListener sqlListener = new SqlPackageEventListener();
    sqlListener.OnPackageError += new SqlPackageEventListener.SqlPackageChangedHandler(sqlListener_OnPackageError);
    Microsoft.SqlServer.Dts.Runtime.Application sqlPackageLoader = new Microsoft.SqlServer.Dts.Runtime.Application();
    Microsoft.SqlServer.Dts.Runtime.Package sqlPackage = Microsoft.SqlServer.Dts.Runtime.sqlPackageLoader.LoadPackage(@"path_to\file.dtsx", sqlListener);
    sqlPackage.Execute(null, null, sqlListener, null, null)

    public void sqlListener_OnPackageError(object sender, EventArgs args) {
        //code to handle the event
    }
} 

Таким образом, «хитрость» заключается в добавлении делегата к вашему объекту «Listener», который вы передаете методу LoadPackage объекта Package, таким образом, мы можем получить доступ к переопределению «OnError» внутри слушателя и вызвать событие. Как вы можете видеть, я реализовал свой собственный класс EventArguments, чтобы мы могли передавать важные данные нашему коду обработчика и видеть, какой пакет запущен, или любую другую информацию, которую вы можете получить, переопределив методы при наследовании от DefaultEvents.

Конечно, я реализовал только OnError здесь, вы можете реализовать любой другой обработчик, который вам нравится, который поддерживается SQL Server и который может быть переопределен, поскольку именно в этой области мы генерируем событие.

Таким образом я могу создать свой объект SqlPackageEventListener и обработать его событие «OnPackageError» с помощью метода sqlListener_OnPackageError и делать все, что мне нужно, в случае любой ошибки, вызванной выполнением пакета служб SSIS.

4
12.12.2008 00:35:29
Я не знаю, что происходит с NLog, потому что, когда я регистрирую, все данные отправляются в другое место. В основном это не получение динамического контекста, установленного из основного потока.
Gandarez 21.01.2016 11:58:43