2008-12-11 9 views
2

J'ai un package SSIS qui exécute plusieurs tâches. J'ai ajouté manuellement un gestionnaire d'événements dans Business Intelligence Studio 2005 au niveau du package pour l'événement OnExecStatusChanged.Comment intercepter des événements d'un package SSIS chargé en C#?

Ma question est, comment puis-je ajouter un gestionnaire pour cet événement à l'intérieur de C#? Je l'ai chargé le paquet comme l'a here et j'ai aussi créé une classe personnalisée héritée de Microsoft.SqlServer.Dts.Runtime.DefaultEvents qui est mon « 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); 

Si je vérifie la propriété sqlPackage.EventHandlers.Count Je reçois le bon numéro pour les gestionnaires ajoutés dans Business Intelligence Studio.

Existe-t-il un moyen de gérer ces événements dans C#?

Merci.

Répondre

4

Eh bien, je ne trouve rien, donc je suis venu avec un travail autour donc je vais automatiquement me répondre:

Comme il n'y a aucun moyen de prendre directement les événements que le package SSIS assurez-je mis en œuvre mon propres événements à l'intérieur de mon 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 
    } 
} 

donc l'objet « truc » est d'ajouter un délégué à votre « Listener » que vous passez à la méthode LoadPackage de l'objet du paquet, de cette façon, nous pouvons accéder à la « OnError "override à l'intérieur de l'écouteur et augmente l'événement. Comme vous pouvez le voir, j'ai implémenté ma propre classe EventArguments afin que nous puissions passer des données importantes à notre code de gestionnaire et voir quel paquet est en cours d'exécution ou toute autre information que vous pouvez obtenir en surchargeant les méthodes lorsque vous héritez de DefaultEvents.

Bien sûr, j'ai seulement implémenté OnError ici, vous pouvez implémenter n'importe quel autre gestionnaire qui est supporté par SQL Server et qui peut être surchargé puisque c'est la portée où nous élevons l'événement.

De cette façon, je peux créer mon objet SqlPackageEventListener et gérer son événement "OnPackageError" avec la méthode sqlListener_OnPackageError et faire tout ce dont j'ai besoin en cas d'erreur causée par l'exécution du package SSIS.

+0

Je ne sais pas ce qui se passe avec NLog parce que quand je me connecte toutes les données vont à un endroit différent. Fondamentalement, il n'obtient pas le jeu de contexte dynamique du thread principal. – Gandarez

Questions connexes