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