我有一个SSIS包,可以执行多个任务。我在OnexeStStatusChanged事件的包级别手动在Business Intelligence Studio 2005中添加了一个事件处理程序。
我的问题是,如何在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#中处理这些事件?
感谢。
答案 0 :(得分: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
}
}
所以“技巧”是将一个委托添加到你传递给Package对象的LoadPackage方法的“Listener”对象,这样,我们可以访问监听器内的“OnError”覆盖并引发事件。正如您所看到的,我实现了自己的EventArguments类,因此我们可以将重要数据传递给我们的处理程序代码,并查看正在运行的包或您从DefaultEvents继承时可以从覆盖方法中获得的任何其他信息。
当然我在这里只实现了OnError,你可以实现你喜欢的任何SQL Server支持的处理程序,并且可以覆盖它,因为那是我们引发事件的范围。
这样我可以使用sqlListener_OnPackageError方法创建我的SqlPackageEventListener对象并使用sqlListener_OnPackageError方法处理它的“OnPackageError”事件,并在出现任何导致SSIS包执行错误的情况下执行任何操作。