Déclenchement et définition d'événements dans une tâche personnalisée

Le moteur d'exécution Integration Services propose une collection d'événements qui fournissent l'état d'avancement d'une tâche lors de sa validation et de son exécution. L'interface IDTSComponentEvents définit ces événements et elle est fournie aux tâches en tant que paramètre pour les méthodes Validate et Execute.

Il existe un autre jeu d'événements, définis dans l'interface IDTSEvents, déclenchée de la part de la tâche par l'objet TaskHost. L'objet TaskHost déclenche des événements qui se produisent avant et après la validation et l'exécution, tandis que la tâche déclenche des événements qui se produisent pendant l'exécution et la validation.

Création d'événements personnalisés

Les développeurs de tâches personnalisées peuvent définir de nouveaux événements personnalisés en créant un objet EventInfo dans leur implémentation substituée de la méthode InitializeTask. Une fois que l'objet EventInfo est créé, il est ajouté à la collection EventInfos à l'aide de la méthode Add. La signature de la méthode Add est la suivante :

public void Add(string eventName, string description, bool allowEventHandlers, string[] parameterNames, TypeCode[] parameterTypes, string[] parameterDescriptions);

L'exemple de code suivant présente la méthode InitializeTask d'une tâche personnalisée, où deux événements personnalisés sont créés et leurs propriétés sont définies. Les nouveaux événements sont ensuite ajoutés à la collection EventInfos.

Pour le premier événement personnalisé, le paramètre eventName a pour valeur OnBeforeIncrement et le paramètre description a pour valeur Se déclenche une fois que la valeur initiale a été mise à jour. Le paramètre suivant, la valeur true, indique que cet événement doit autoriser la création d'un conteneur de gestionnaire d'événements pour gérer l'événement. Le gestionnaire d'événements est un conteneur qui fournit une structure dans un package et des services à des tâches, comme d'autres conteneurs tels que le package, Séquence, ForLoop et ForEachLoop. Lorsque le paramètre allowEventHandlers a pour valeur true, les objets DtsEventHandler sont créés pour l'événement. Tous les paramètres définis pour l'événement sont maintenant disponibles pour l'objet DtsEventHandler dans la collection de variables de l'objet DtsEventHandler.

public override void InitializeTask(Connections connections,
   VariableDispenser variables, IDTSInfoEvents events,
   IDTSLogging log, EventInfos eventInfos,
   LogEntryInfos logEntryInfos, ObjectReferenceTracker refTracker)
{
    this.eventInfos = eventInfos;
    string[] paramNames = new string[1];
    TypeCode[] paramTypes = new TypeCode[1]{TypeCode.Int32};
    string[] paramDescriptions = new string[1];

    paramNames[0] = "InitialValue";
    paramDescriptions[0] = "The value before it is incremented.";

    this.eventInfos.Add("OnBeforeIncrement", 
      "Fires before the task increments the value.",
      true,paramNames,paramTypes,paramDescriptions);
    this.onBeforeIncrement = this.eventInfos["OnBeforeIncrement"];

    paramDescriptions[0] = "The value after it has been incremented.";
    this.eventInfos.Add("OnAfterIncrement",
      "Fires after the initial value is updated.",
      true,paramNames, paramTypes,paramDescriptions);
    this.onAfterIncrement = this.eventInfos["OnAfterIncrement"];
}
Public Overrides Sub InitializeTask(ByVal connections As Connections, _
ByVal variables As VariableDispenser, ByVal events As IDTSInfoEvents, _
ByVal log As IDTSLogging, ByVal eventInfos As EventInfos, _
ByVal logEntryInfos As LogEntryInfos, ByVal refTracker As ObjectReferenceTracker) 

    Dim paramNames(0) As String
    Dim paramTypes(0) As TypeCode = {TypeCode.Int32}
    Dim paramDescriptions(0) As String

    Me.eventInfos = eventInfos

    paramNames(0) = "InitialValue"
    paramDescriptions(0) = "The value before it is incremented."

    Me.eventInfos.Add("OnBeforeIncrement", _
      "Fires before the task increments the value.", _
      True, paramNames, paramTypes, paramDescriptions)
    Me.onBeforeIncrement = Me.eventInfos("OnBeforeIncrement")

    paramDescriptions(0) = "The value after it has been incremented."
    Me.eventInfos.Add("OnAfterIncrement", _
      "Fires after the initial value is updated.", True, _
      paramNames, paramTypes, paramDescriptions)
    Me.onAfterIncrement = Me.eventInfos("OnAfterIncrement")

End Sub

Déclenchement d'événements personnalisés

Les événements personnalisés sont déclenchés en appelant la méthode FireCustomEvent. La ligne de code suivante déclenche un événement personnalisé.

componentEvents.FireCustomEvent(this.onBeforeIncrement.Name,
   this.onBeforeIncrement.Description, ref arguments,
   null, ref bFireOnBeforeIncrement);
componentEvents.FireCustomEvent(Me.onBeforeIncrement.Name, _
Me.onBeforeIncrement.Description, arguments, _
Nothing,  bFireOnBeforeIncrement)

Exemple

L'exemple suivant montre une tâche qui définit un événement personnalisé dans la méthode InitializeTask, qui ajoute l'événement personnalisé à la collection EventInfos, puis qui déclenche l'événement personnalisé pendant sa méthode Execute en appelant la méthode FireCustomEvent.

[DtsTask(DisplayName = "CustomEventTask")]
    public class CustomEventTask : Task
    {
        public override DTSExecResult Execute(Connections connections, 
          VariableDispenser variableDispenser, IDTSComponentEvents componentEvents,
           IDTSLogging log, object transaction)
        {
            bool fireAgain;
            object[] args = new object[1] { "The value of the parameter." };
            componentEvents.FireCustomEvent( "MyCustomEvent", 
              "Firing the custom event.", ref args,
              "CustomEventTask" , ref fireAgain );
            return DTSExecResult.Success;
        }

        public override void InitializeTask(Connections connections,
          VariableDispenser variableDispenser, IDTSInfoEvents events,
          IDTSLogging log, EventInfos eventInfos,
          LogEntryInfos logEntryInfos, ObjectReferenceTracker refTracker)
        {
            string[] names = new string[1] {"Parameter1"};
            TypeCode[] types = new TypeCode[1] {TypeCode.String};
            string[] descriptions = new string[1] {"Parameter description." };

            eventInfos.Add("MyCustomEvent",
             "Fires when my interesting event happens.",
             true, names, types, descriptions);

        }
   }
<DtsTask(DisplayName = "CustomEventTask")> _ 
    Public Class CustomEventTask
     Inherits Task
        Public Overrides Function Execute(ByVal connections As Connections, _
          ByVal variableDispenser As VariableDispenser, _
          ByVal componentEvents As IDTSComponentEvents, _
          ByVal log As IDTSLogging, ByVal transaction As Object) _
          As DTSExecResult

            Dim fireAgain As Boolean
            Dim args() As Object =  New Object(1) {"The value of the parameter."}

            componentEvents.FireCustomEvent("MyCustomEvent", _
              "Firing the custom event.", args, _
              "CustomEventTask" ,  fireAgain)
            Return DTSExecResult.Success
        End Function
 
        Public Overrides  Sub InitializeTask(ByVal connections As Connections, _
          ByVal variableDispenser As VariableDispenser,
          ByVal events As IDTSInfoEvents,
          ByVal log As IDTSLogging, ByVal eventInfos As EventInfos, ByVal logEnTryInfos As LogEnTryInfos, ByVal refTracker As ObjectReferenceTracker)

            Dim names() As String =  New String(1) {"Parameter1"}
            Dim types() As TypeCode =  New TypeCode(1) {TypeCode.String}
            Dim descriptions() As String =  New String(1) {"Parameter description."}

            eventInfos.Add("MyCustomEvent", _
              "Fires when my interesting event happens.", _
              True, names, types, descriptions)

        End Sub

    End Class
Icône Integration Services (petite) Rester à jour avec Integration Services

Pour obtenir les derniers téléchargements, articles, exemples et vidéos de Microsoft, ainsi que des solutions sélectionnées par la communauté, visitez la page Integration Services sur MSDN ou TechNet :

Pour recevoir une notification automatique de ces mises à jour, abonnez-vous aux flux RSS disponibles sur la page.