Auslösen und Definieren von Ereignissen in einem benutzerdefinierten Task

Das Integration Services-Laufzeitmodul bietet eine Auflistung von Ereignissen, die Statusinformationen zu dem Fortschritt eines Tasks liefern, während der Task überprüft und ausgeführt wird. Diese Ereignisse werden durch die IDTSComponentEvents-Schnittstelle definiert. Sie wird Tasks als Parameter für die Validate-Methode und die Execute-Methode bereitgestellt.

Es gibt eine weitere Gruppe von Ereignissen, die in der IDTSEvents-Schnittstelle definiert sind und von Seiten des Tasks von TaskHost ausgelöst werden. Der TaskHost löst Ereignisse aus, die vor und nach der Validierung und Ausführung auftreten, wohingegen der Task die Ereignisse auslöst, die während der Ausführung und Validierung auftreten.

Erstellen von benutzerdefinierten Ereignissen

Entwickler von benutzerdefinierten Tasks können neue, benutzerdefinierte Ereignisse definieren, indem sie eine neue EventInfo in der außer Kraft gesetzten Implementierung der InitializeTask-Methode erstellen. Nachdem die EventInfo erstellt wurde, wird sie der EventInfos-Auflistung mithilfe der Add-Methode hinzugefügt. Die Methodensignatur der Add-Methode lautet wie folgt:

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

Im folgenden Codebeispiel ist die InitializeTask-Methode eines benutzerdefinierten Tasks dargestellt. Es werden zwei benutzerdefinierte Ereignisse erstellt und ihre Eigenschaften festgelegt. Die neuen Ereignisse werden dann der EventInfos-Auflistung hinzugefügt.

Das erste benutzerdefinierte Ereignis weist den eventName „OnBeforeIncrement“ und die description „Wird ausgelöst, wenn der anfängliche Wert aktualisiert wird.“ auf. Der nächste Parameter, der Wert true, gibt an, dass in diesem Ereignis die Erstellung eines Ereignishandlercontainers zulässig sein muss, um das Ereignis zu behandeln. Bei dem Ereignishandler handelt es sich um einen Container für die Strukturen in Paketen und Dienste für Tasks, wie andere Container, z. B. Paketcontainer, Sequenzcontainer, For-Schleifencontainer und ForEach-Schleifencontainer. Wenn der allowEventHandlers-Parameter true ist, werden DtsEventHandler-Objekte für das Ereignis erstellt. Alle Parameter, die für das Ereignis definiert wurden, sind nun für den DtsEventHandler in der Variablenauflistung des DtsEventHandler verfügbar.

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

Auslösen von benutzerdefinierten Ereignissen

Benutzerdefinierte Ereignisse werden erstellt, indem die FireCustomEvent-Methode aufgerufen wird. Die folgende Codezeile löst ein benutzerdefiniertes Ereignis aus.

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

Beispiel

Im folgenden Beispiel ist ein Task dargestellt, der ein benutzerdefiniertes Ereignis in der InitializeTask-Methode definiert, das benutzerdefinierte Ereignis der EventInfos-Auflistung hinzufügt und dann das benutzerdefinierte Ereignis während der Execute-Methode durch Aufrufen der FireCustomEvent-Methode auslöst.

[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
Integration Services (kleines Symbol) Bleiben Sie mit Integration Services auf dem neuesten Stand

Die neuesten Downloads, Artikel, Beispiele und Videos von Microsoft sowie ausgewählte Lösungen aus der Community finden Sie auf der Integration Services-Seite von MSDN oder TechNet:

Abonnieren Sie die auf der Seite verfügbaren RSS-Newsfeeds, um automatische Benachrichtigungen zu diesen Aktualisierungen zu erhalten.