2008-12-11 4 views
2

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

Мой вопрос: как я могу добавить обработчик для этого события внутри C#? Я загрузил пакет как указано here и я также создал пользовательский класс, унаследованный от 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#?

Спасибо.

ответ

4

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

Поскольку нет никакого способа, чтобы непосредственно поймать события, что пакет SSIS сделать тогда я осуществил мой собственные события внутри моего listener:

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

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

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

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

+0

Я не знаю, что происходит с NLog, потому что, когда я регистрирую все данные, вы попадаете в другое место. В принципе, он не получает динамический контекст, заданный из основного потока. – Gandarez

 Смежные вопросы

  • Нет связанных вопросов^_^