繁体   English   中英

如何从C#中加载的SSIS包中捕获事件?

[英]How do I catch events from an SSIS package loaded in C#?

我有一个SSIS包,可以执行多个任务。 我在业务智能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#中处理这些事件?

谢谢。

好吧,我什么都没找到,所以我想出了一个解决方法,因此我会自动回复给我:

由于无法直接捕获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
    }
} 

因此,“技巧”是向传递给Package对象的LoadPackage方法的“侦听器”对象添加委托,这样,我们就可以访问侦听器内部的“ OnError”替代并引发事件。 如您所见,我实现了我自己的EventArguments类,因此我们可以将重要数据传递给我们的处理程序代码,并查看正在运行的程序包或从DefaultEvents继承时重写方法所获得的任何其他信息。

当然,我在这里仅实现了OnError,您可以实现SQL Server支持的任何您喜欢的其他处理程序,这些处理程序可以被覆盖,因为这是引发事件的范围。

这样,我可以创建我的SqlPackageEventListener对象并使用sqlListener_OnPackageError方法处理它的“ OnPackageError”事件,并在发生SSIS包执行引起的任何错误的情况下执行所需的任何操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM