2008-12-11 59 views
2

我有一個執行多個任務的SSIS包。我在OnExecStatusChanged事件的包級別手動添加了Business Intelligence Studio 2005內的事件處理程序。如何從C#中加載的SSIS包中捕獲事件?

我的問題是,我怎麼能在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包使然後我實現了事件

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:在我的listener自己的事件「在監聽器內部覆蓋並提出事件。正如你所看到的,我實現了自己的EventArguments類,因此我們可以將重要數據傳遞給我們的處理程序代碼,並查看運行的包或從DefaultEvents繼承時覆蓋方法時可以獲得的任何其他信息。

當然,我在這裏只實現了OnError,你可以實現任何你喜歡的,受SQL Server支持並且可以被覆蓋的處理程序,因爲這是我們提出事件的範圍。

這樣我就可以創建我的SqlPackageEventListener對象,並使用sqlListener_OnPackageError方法處理它的「OnPackageError」事件,並在SSIS包的執行引起任何錯誤時執行我所需的任何操作。

+0

我不知道NLog發生了什麼事,因爲當我將所有數據記錄到不同的位置時。基本上它沒有從主線程獲取動態上下文集。 – Gandarez 2016-01-21 11:58:43