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

У меня есть пакет служб 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 #?

Спасибо.

1 Ответ

4 голосов
/ 12 декабря 2008

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

Поскольку нет способа напрямую перехватить события, создаваемые пакетом служб 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.

...