Laufzeitmethoden einer Datenflusskomponente
Zur Laufzeit wird vom Datenflusstask die Reihenfolge von Komponenten überprüft, ein Ausführungsplan vorbereitet und ein Pool von Arbeitsthreads verwaltet, die den Arbeitsplan ausführen. Der Task lädt Datenzeilen aus Quellen, verarbeitet diese durch Transformationen und speichert sie dann in Zielen.
Reihenfolge der Methodenausführung
Während der Ausführung einer Datenflusskomponente, wird eine Untergruppe der Methoden in der PipelineComponent-Basisklasse aufgerufen. Die Methoden und die Reihenfolge, in der diese aufgerufen werden, sind immer gleich, mit Ausnahme der PrimeOutput-Methode und der ProcessInput-Methode. Diese beiden Methoden werden basierend auf dem Vorhandensein und der Konfiguration des IDTSInput100-Objekts und des IDTSOutput100-Objekts einer Komponente aufgerufen.
In der folgenden Liste sind die Methoden in der Reihenfolge veranschaulicht, in der sie während der Komponentenausführung aufgerufen werden. Beachten Sie, dass PrimeOutput im Falle eines Aufrufs immer vor ProcessInput aufgerufen wird.
PrimeOutput-Methode
Die PrimeOutput-Methode wird aufgerufen, wenn eine Komponente mindestens eine Ausgabe aufweist, die über ein IDTSPath100-Objekt an eine Downstreamkomponente angefügt ist, und die SynchronousInputID-Eigenschaft der Ausgabe Null beträgt. Die PrimeOutput-Methode wird für Quellkomponenten und Transformationen mit asynchronen Ausgaben aufgerufen. Im Gegensatz zu der weiter unten beschriebenen ProcessInput-Methode wird die PrimeOutput-Methode nur einmal für jede Komponente aufgerufen, für die dies erforderlich ist.
ProcessInput-Methode
Die ProcessInput-Methode wird für Komponenten aufgerufen, die über mindestens eine Eingabe verfügen, die durch ein IDTSPath100-Objekt an eine Upstreamkomponente angefügt ist. Die ProcessInput-Methode wird für Zielkomponenten und für Transformationen mit synchronen Ausgaben aufgerufen. ProcessInput wird wiederholt aufgerufen, bis keine weiteren Zeilen von Upstreamkomponenten für die Bearbeitung mehr vorhanden sind.
Arbeiten mit Eingaben und Ausgaben
Zur Laufzeit werden die folgenden Tasks von Datenflusskomponenten ausgeführt:
Quellkomponenten fügen Zeilen hinzu.
Transformationskomponenten mit synchronen Ausgaben empfangen von Quellkomponenten bereitgestellte Zeilen.
Transformationskomponenten mit asynchronen Ausgaben empfangen Zeilen und fügen Zeilen hinzu.
Zielkomponenten empfangen Zeilen und laden sie dann in ein Ziel.
Während der Ausführung ordnet der Datenflusstask PipelineBuffer-Objekte zu, die alle Spalten enthalten, die in der Ausgabespaltenauflistung einer Sequenz von Komponenten definiert sind. Wenn jede der vier Komponenten in einem Datenflusstask beispielsweise seiner Ausgabespaltenauflistung eine Ausgabespalte hinzufügt, enthält der Puffer, der jeder Komponente bereitgestellt wird, vier Spalten, eine für jede Ausgabespalte pro Komponente. Aufgrund dieses Verhaltens empfängt eine Komponente manchmal Puffer, die Spalten enthalten, die nicht verwendet werden.
Da die von der Komponente empfangenen Puffer Spalten enthalten können, die von der Komponente nicht verwendet werden, müssen Sie die Spalten, die Sie in den Eingabe- und Ausgabespaltenauflistungen der Komponente verwenden möchten, in dem Puffer suchen, der der Komponente von dem Datenflusstask bereitgestellt wird. Dazu steht Ihnen die FindColumnByLineageID-Methode der BufferManager-Eigenschaft zur Verfügung. Aus Leistungsgründen wird dieser Task in der Regeln nur während der PreExecute-Methode ausgeführt und nicht in PrimeOutput oder ProcessInput.
PreExecute wird vor der PrimeOutput-Methode und der ProcessInput-Methode aufgerufen. Dies ist auch die erste Gelegenheit für eine Komponente, diese Arbeit auszuführen, nachdem BufferManager für diese Komponente verfügbar wird. Während dieser Methode sollte die Komponente ihre Spalten in den Puffern suchen und diese Informationen intern speichern, sodass die Spalten in der PrimeOutput-Methode oder der ProcessInput-Methode verwendet werden können.
Im folgenden Codebeispiel wird veranschaulicht, wie eine Transformationskomponente mit synchroner Ausgabe ihre Eingabespalten während der PreExecute-Methode im Puffer sucht.
private int []bufferColumnIndex;
public override void PreExecute()
{
IDTSInput100 input = ComponentMetaData.InputCollection[0];
bufferColumnIndex = new int[input.InputColumnCollection.Count];
for( int x=0; x < input.InputColumnCollection.Count; x++)
{
IDTSInputColumn100 column = input.InputColumnCollection[x];
bufferColumnIndex[x] = BufferManager.FindColumnByLineageID( input.Buffer, column.LineageID);
}
}
Dim bufferColumnIndex As Integer()
Public Overrides Sub PreExecute()
Dim input As IDTSInput100 = ComponentMetaData.InputCollection(0)
ReDim bufferColumnIndex(input.InputColumnCollection.Count)
For x As Integer = 0 To input.InputColumnCollection.Count
Dim column As IDTSInputColumn100 = input.InputColumnCollection(x)
bufferColumnIndex(x) = BufferManager.FindColumnByLineageID(input.Buffer, column.LineageID)
Next
End Sub
Hinzufügen von Zeilen
Komponenten liefern Zeilen für Downstreamkomponenten, indem PipelineBuffer-Objekten Zeilen hinzugefügt werden. Der Datenflusstask stellt ein Array von Ausgabepuffern – einen für jedes IDTSOutput100-Objekt, das mit einer Downstreamkomponente verbunden ist – als Parameter für die PrimeOutput-Methode bereit. Quellkomponenten und Transformationskomponenten mit asynchronen Ausgaben fügen den Puffern Zeilen hinzu und rufen die SetEndOfRowset-Methode auf, wenn das Hinzufügen der Zeilen abgeschlossen ist. Der Datenflusstask verwaltet die Ausgabepuffer, die er den Komponenten bereitstellt und verschiebt die Zeilen in dem Puffer automatisch zur nächsten Komponente, wenn der Puffer voll ist. Die PrimeOutput-Methode wird, im Gegensatz zur ProcessInput-Methode, die wiederholt aufgerufen wird, einmal pro Komponente aufgerufen.
Im folgenden Codebeispiel wird veranschaulicht, wie eine Komponente ihrem Ausgabepuffer Zeilen während der PrimeOutput-Methode hinzufügt und dann die SetEndOfRowset-Methode aufruft.
public override void PrimeOutput( int outputs, int []outputIDs,PipelineBuffer []buffers)
{
for( int x=0; x < outputs; x++ )
{
IDTSOutput100 output = ComponentMetaData.OutputCollection.GetObjectByID( outputIDs[x]);
PipelineBuffer buffer = buffers[x];
// TODO: Add rows to the output buffer.
}
foreach( PipelineBuffer buffer in buffers )
{
/// Notify the data flow task that no more rows are coming.
buffer.SetEndOfRowset();
}
}
public overrides sub PrimeOutput( outputs as Integer , outputIDs() as Integer ,buffers() as PipelineBuffer buffers)
For x As Integer = 0 To outputs.MaxValue
Dim output As IDTSOutput100 = ComponentMetaData.OutputCollection.GetObjectByID(outputIDs(x))
Dim buffer As PipelineBuffer = buffers(x)
' TODO: Add rows to the output buffer.
Next
For Each buffer As PipelineBuffer In buffers
' Notify the data flow task that no more rows are coming.
buffer.SetEndOfRowset()
Next
End Sub
Weitere Informationen zum Entwickeln von Komponenten, die Ausgabepuffern Zeilen hinzufügen, finden Sie unter Entwickeln einer benutzerdefinierten Quellkomponente und Entwickeln einer benutzerdefinierten Transformationskomponente mit asynchronen Ausgaben.
Empfangen von Zeilen
Komponenten empfangen Zeilen von Upstreamkomponenten in PipelineBuffer-Objekten. Der Datenflusstask stellt ein PipelineBuffer-Objekt, das die dem Datenfluss von Upstreamkomponenten hinzugefügten Zeilen enthält, einer ProcessInput-Methode als Parameter bereit. Dieser Eingabepuffer kann verwendet werden, um die Zeilen und Spalten in dem Puffer zu überprüfen und zu ändern, er kann jedoch nicht verwendet werden, um Zeilen hinzuzufügen oder zu entfernen. Die ProcessInput-Methode wird immer wieder aufgerufen, bis keine verfügbaren Puffer mehr vorhanden sind. Beim letzten Aufruf ist die EndOfRowset-Eigenschaft true. Sie können eine Iteration durch die Auflistung von Zeilen in dem Puffer mithilfe der NextRow-Methode durchführen, durch die der Puffer zur nächsten Zeile bewegt wird. Diese Methode gibt false zurück, wenn sich der Puffer in der letzten Zeile der Auflistung befindet. Sie müssen die EndOfRowset-Eigenschaft nicht überprüfen, außer Sie müssen eine weitere Aktion ausführen, nachdem die letzte Datenzeile verarbeitet wurde.
Im folgenden Text wird das korrekte Muster für die Verwendung NextRow-Methode und der EndOfRowset-Eigenschaft veranschaulicht.
while (buffer.NextRow())
{
// Für jede Zeile eine Aktion ausführen
}
if (buffer.EndOfRowset)
{
// Optional eine Aktion ausführen, nachdem alle Zeilen verarbeitet wurden
}
Im folgenden Codebeispiel wird veranschaulicht, wie eine Komponente die Zeilen in Eingabepuffern während der ProcessInput-Methode verarbeitet.
public override void ProcessInput( int inputID, PipelineBuffer buffer )
{
{
IDTSInput100 input = ComponentMetaData.InputCollection.GetObjectByID(inputID);
while( buffer.NextRow())
{
// TODO: Examine the columns in the current row.
}
}
Public Overrides Sub ProcessInput(ByVal inputID As Integer, ByVal buffer As PipelineBuffer)
Dim input As IDTSInput100 = ComponentMetaData.InputCollection.GetObjectByID(inputID)
While buffer.NextRow() = True
' TODO: Examine the columns in the current row.
End While
End Sub
Weitere Informationen zum Entwickeln von Komponenten, die Zeilen in Eingabepuffern empfangen, finden Sie unter Entwickeln einer benutzerdefinierten Zielkomponente und Entwickeln einer benutzerdefinierten Transformationskomponente mit synchronen Ausgaben.
|