Auslösen und Definieren von Ereignissen in einer Datenflusskomponente
Komponentenentwickler können eine Teilmenge der Ereignisse, die in der IDTSComponentEvents-Schnittstelle definiert sind, auslösen, indem sie die in der ComponentMetaData-Eigenschaft verfügbaren Methoden aufrufen. Außerdem können Sie benutzerdefinierte Ereignisse mit der EventInfos-Auflistung definieren und sie während der Ausführung mit der FireCustomEvent-Methode auslösen. In diesem Abschnitt wird beschrieben, wie Sie ein Ereignis erstellen und auslösen können und es werden Richtlinien bereitgestellt, wann Ereignisse zur Entwurfszeit ausgelöst werden sollen.
Auslösen von Ereignissen
Komponenten lösen Ereignisse mit den Fire<X>-Methoden der IDTSComponentMetaData100-Schnittstelle aus. Sie können während des Entwurfs und der Ausführung von Komponenten Ereignisse auslösen. In der Regel werden während der Überprüfung beim Entwurf der Komponenten die FireError- und FireWarning-Methoden aufgerufen. Diese Ereignisse zeigen Meldungen im Bereich Fehlerliste von SQL Server-Datentools (SSDT) an und stellen für die Benutzer der Komponente Feedback bereit, wenn eine Komponente nicht richtig konfiguriert ist.
Komponenten können auch zu einem beliebigen Zeitpunkt während der Ausführung Ereignisse auslösen. Ereignisse ermöglichen es Komponentenentwicklern, während der Ausführung einer Komponente Feedback für deren Benutzer bereitzustellen. Bei Aufruf der FireError-Methode während der Ausführung ist ein Versagen des Pakets wahrscheinlich.
Definieren und Auslösen von benutzerdefinierten Ereignissen
Definieren eines benutzerdefinierten Ereignisses
Benutzerdefinierte Ereignisse werden erstellt, indem die Add-Methode der EventInfos-Auflistung aufgerufen wird. Diese Auflistung wird durch den Datenflusstask festgelegt und dem Komponentenentwickler über die PipelineComponent-Basisklasse als Eigenschaft bereitgestellt. Diese Klasse enthält durch den Datenflusstask definierte sowie durch die Komponente während der RegisterEvents-Methode definierte benutzerdefinierte Ereignisse.
Die benutzerdefinierten Ereignisse einer Komponente werden nicht permanent im Paket-XML beibehalten. Daher wird sowohl während der Entwicklung als auch während der Ausführung die RegisterEvents-Methode aufgerufen, um der Komponente die Definition der von ihr ausgelösten Ereignisse zu ermöglichen.
Der allowEventHandlers-Parameter der Add-Methode gibt an, ob die Komponente die Erstellung von DtsEventHandler-Objekten für das Ereignis zulässt. Beachten Sie, dass DtsEventHandlers synchron sind. Daher setzt die Komponente die Ausführung erst dann fort, wenn ein an das benutzerdefinierte Ereignis angefügter DtsEventHandler die Ausführung abgeschlossen hat. Wenn der allowEventHandlers-Parameter true entspricht, dann wird jeder Parameter des Ereignisses automatisch allen DtsEventHandler-Objekten über Variablen, die automatisch von der SQL Server Integration Services-Laufzeit erstellt und aufgefüllt werden, zur Verfügung gestellt.
Auslösen eines benutzerdefinierten Ereignisses
Komponenten lösen benutzerdefinierter Ereignisse durch Aufrufen der FireCustomEvent-Methode aus, und stellen den Namen, den Text und die Parameter des Ereignisses bereit. Wenn der allowEventHandlers-Parameter true entspricht, dann werden alle DtsEventHandlers, die für das benutzerdefinierter Ereignis erstellt wurden, vom SSIS-Laufzeitmodul ausgeführt.
Beispiel für ein benutzerdefiniertes Ereignis
Im folgenden Codebeispiel wird eine Komponente gezeigt, die während der RegisterEvents-Methode ein benutzerdefiniertes Ereignis definiert und dann durch Aufrufen der FireCustomEvent-Methode das Ereignis zur Laufzeit auslöst.
public override void RegisterEvents()
{
string [] parameterNames = new string[2]{"RowCount", "StartTime"};
ushort [] parameterTypes = new ushort[2]{ DtsConvert.VarTypeFromTypeCode(TypeCode.Int32), DtsConvert.VarTypeFromTypeCode(TypeCode.DateTime)};
string [] parameterDescriptions = new string[2]{"The number of rows to sort.", "The start time of the Sort operation."};
EventInfos.Add("StartingSort","Fires when the component begins sorting the rows.",false,ref parameterNames, ref paramterTypes, ref parameterDescriptions);
}
public override void ProcessInput(int inputID, PipelineBuffer buffer)
{
while (buffer.NextRow())
{
// Process buffer rows.
}
IDTSEventInfo100 eventInfo = EventInfos["StartingSort"];
object []arguments = new object[2]{buffer.RowCount, DateTime.Now };
ComponentMetaData.FireCustomEvent("StartingSort", "Beginning sort operation.", ref arguments, ComponentMetaData.Name, ref FireSortEventAgain);
}
Public Overrides Sub RegisterEvents()
Dim parameterNames As String() = New String(2) {"RowCount", "StartTime"}
Dim parameterTypes As System.UInt16() = New System.UInt16(2) {DtsConvert.VarTypeFromTypeCode(TypeCode.Int32), DtsConvert.VarTypeFromTypeCode(TypeCode.DateTime)}
Dim parameterDescriptions As String() = New String(2) {"The number of rows to sort.", "The start time of the Sort operation."}
EventInfos.Add("StartingSort", "Fires when the component begins sorting the rows.", False, parameterNames, paramterTypes, parameterDescriptions)
End Sub
Public Overrides Sub ProcessInput(ByVal inputID As Integer, ByVal buffer As PipelineBuffer)
While buffer.NextRow
End While
Dim eventInfo As IDTSEventInfo100 = EventInfos("StartingSort")
Dim arguments As Object() = New Object(2) {buffer.RowCount, DateTime.Now}
ComponentMetaData.FireCustomEvent("StartingSort", _
"Beginning sort operation.", arguments, _
ComponentMetaData.Name, FireSortEventAgain)
End Sub
|
Siehe auch
Aufgaben
Hinzufügen eines Ereignishandlers zu einem Paket