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

标签 c# sql-server database ssis dts

我有一个执行多个任务的 SSIS 包。我在 Business Intelligence Studio 2005 中手动添加了 OnExecStatusChanged 事件的包级别的事件处理程序。

我的问题是,如何在 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# 中处理这些事件?

谢谢。

最佳答案

好吧,我没有找到任何东西,所以我想出了一个解决方法,这样我就会自动回复我:

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

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

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

这样我就可以创建我的 SqlPackageEventListener 对象并使用 sqlListener_OnPackageError 方法处理它的“OnPackageError”事件,并在 SSIS 包的执行导致任何错误时执行我需要的操作。

关于c# - 如何从 C# 中加载的 SSIS 包捕获事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/358273/

相关文章:

c# - RavenDb - 按结果过滤分组的多图索引

sql - XACT_ABORT 不回滚 SQL Server 2012 上的事务

sql - 小计和总计 SQL Pivot

c# - 如何通过 EventToCommand 将 LayoutRoot 发送到 RelayCommand?

c# - 从 byte[] 创建位图

database - 什么是用于小型 F# winforms 项目的优质轻量级数据库?

c++ - 对象将自身存储到数据库中

iOS:释放 NSString 对象,从 sqlite 数据库读取数据

c# - '无法访问已处置的对象。此错误的一个常见原因是处理从依赖注入(inject)中解析的上下文

sql - 外键约束