Come posso prendo gli eventi da un pacchetto SSIS caricata in C #?
-
21-08-2019 - |
Domanda
Ho un pacchetto SSIS che esegue diversi compiti. Ho aggiunto manualmente un gestore di eventi all'interno di Business Intelligence Studio 2005 a livello di pacchetto per l'evento OnExecStatusChanged.
La mia domanda è, come posso aggiungere un gestore per questo evento all'interno di C #? Ho caricato il pacchetto come qui I e anche creato una classe personalizzata ereditata dalla Microsoft.SqlServer.Dts.Runtime.DefaultEvents che è il mio "Listener":
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);
Se controllo la proprietà sqlPackage.EventHandlers.Count ottengo il numero giusto per i gestori aggiunti all'interno Business Intelligence Studio.
C'è qualche modo per gestire questi eventi all'interno di C #?
Grazie.
Soluzione
Beh, io non ho trovato niente di così mi si avvicinò con un lavoro in giro quindi mi auto-rispondere a me:
Dato che non v'è alcun modo per catturare direttamente gli eventi che il pacchetto SSIS rendono poi ho realizzato i miei eventi dentro il mio ascoltatore :
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
}
}
Quindi, il "trucco" è quello di aggiungere un delegato al vostro oggetto "Listener" che si passa al metodo LoadPackage dell'oggetto pacchetto, in questo modo, si può accedere al "OnError" override dentro l'ascoltatore e generare l'evento. Come potete vedere ho implementato mia classe EventArguments in modo che possiamo passare i dati importanti al nostro codice del gestore e vedere quale pacchetto è in esecuzione o qualsiasi altra informazione che si può ottenere da sovrascrivendo i metodi quando si eredita dalla DefaultEvents.
Naturalmente ho implementato solo OnError qui, è possibile implementare qualsiasi altro gestore ti piace che è supportato da SQL Server e che possono essere overrided dal momento che è l'ambito in cui alziamo l'evento.
In questo modo posso creare il mio oggetto SqlPackageEventListener e gestire è evento "OnPackageError" con il metodo sqlListener_OnPackageError e fare tutto ciò che ho bisogno in caso di qualsiasi errore che l'esecuzione del pacchetto SSIS causato.