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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top