Ну, я ничего не нашел, так что я придумал обходной путь, чтобы я автоматически отвечал мне:
Поскольку нет способа напрямую перехватить события, создаваемые пакетом служб 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
}
}
Таким образом, «хитрость» заключается в добавлении делегата к вашему объекту «Listener», который вы передаете методу LoadPackage объекта Package, таким образом, мы можем получить доступ к переопределению «OnError» внутри слушателя и вызвать событие. Как вы можете видеть, я реализовал свой собственный класс EventArguments, чтобы мы могли передавать важные данные нашему коду обработчика и видеть, какой пакет запущен, или любую другую информацию, которую вы можете получить, переопределив методы при наследовании от DefaultEvents.
Конечно, я реализовал только OnError здесь, вы можете реализовать любой другой обработчик, который вам нравится, который поддерживается SQL Server и который может быть переопределен, поскольку это область, в которой мы генерируем событие.
Таким образом, я могу создать свой объект SqlPackageEventListener и обработать его событие «OnPackageError» с помощью метода sqlListener_OnPackageError и делать все, что мне нужно в случае любой ошибки, вызванной выполнением пакета служб SSIS.