Metodi di runtime di un componente del flusso di datiRun-time Methods of a Data Flow Component

In fase di esecuzione l'attività Flusso di dati esamina la sequenza di componenti, prepara un piano di esecuzione e gestisce un pool di thread di lavoro che eseguono il piano di lavoro.At run time, the data flow task examines the sequence of components, prepares an execution plan, and manages a pool of worker threads that execute the work plan. L'attività carica righe di dati dalle origini, li elabora tramite trasformazioni, quindi li salva nelle destinazioni.The task loads rows of data from sources, processes them through transformations, then saves them to destinations.

Sequenza di esecuzione dei metodiSequence of Method Execution

Durante l'esecuzione di un componente del flusso di dati, viene chiamato un subset dei metodi nella classe di base PipelineComponent.During the execution of a data flow component, a subset of the methods in the PipelineComponent base class is called. I metodi, così come la sequenza con cui vengono chiamati, sono sempre gli stessi, ad eccezione dei metodi PrimeOutput e ProcessInput.The methods, and the sequence in which they are called, are always the same, with the exception of the PrimeOutput and ProcessInput methods. Questi due metodi vengono chiamati in base all'esistenza e alla configurazione degli oggetti IDTSInput100 e IDTSOutput100 di un componente.These two methods are called based on the existence and configuration of a component's IDTSInput100 and IDTSOutput100 objects.

Nell'elenco seguente sono illustrati i metodi nell'ordine in cui vengono chiamati durante l'esecuzione del componente.The following list shows the methods in the order in which they are called during component execution. Si noti che PrimeOutput, se chiamato, viene sempre chiamato prima di ProcessInput.Note that PrimeOutput, when called, is always called before ProcessInput.

Metodo PrimeOutputPrimeOutput Method

Il metodo PrimeOutput viene chiamato quando un componente include almeno un output, connesso a un componente a valle tramite un oggetto IDTSPath100, la cui proprietà SynchronousInputID è zero.The PrimeOutput method is called when a component has at least one output, attached to a downstream component through an IDTSPath100 object, and the SynchronousInputID property of the output is zero. Il metodo PrimeOutput viene chiamato per i componenti di origine e per le trasformazioni con output asincroni.The PrimeOutput method is called for source components and for transformations with asynchronous outputs. A differenza del metodo ProcessInput descritto di seguito, il metodo PrimeOutput viene chiamato una sola volta per ogni componente che lo richiede.Unlike the ProcessInput method described below, the PrimeOutput method is only called once for each component that requires it.

Metodo ProcessInput ProcessInput Method

Il metodo ProcessInput viene chiamato per i componenti che includono almeno un input connesso a un componente a monte tramite un oggetto IDTSPath100.The ProcessInput method is called for components that have at least one input attached to an upstream component by an IDTSPath100 object. Il metodo ProcessInput viene chiamato per i componenti di destinazione e per le trasformazioni con output sincroni.The ProcessInput method is called for destination components and for transformations with synchronous outputs. ProcessInput viene chiamato ripetutamente finché non sono più disponibili righe da elaborare dei componenti a monte.ProcessInput is called repeatedly until there are no more rows to process from upstream components.

Utilizzo di input e outputWorking with Inputs and Outputs

In fase di esecuzione i componenti del flusso di dati eseguono le attività seguenti:At run time, data flow components perform the following tasks:

  • I componenti di origine aggiungono righe.Source components add rows.

  • I componenti di trasformazione con output sincroni ricevono le righe fornite dai componenti di origine.Transformation components with synchronous outputs receive rows provided by source components.

  • I componenti di trasformazione con output asincroni ricevono e aggiungono righe.Transformation components with asynchronous outputs receive rows and add rows.

  • I componenti di destinazione ricevono righe e quindi le caricano in una destinazione.Destination components receive rows and then load them into a destination.

    Durante l'esecuzione, l'attività Flusso di dati alloca oggetti PipelineBuffer che contengono tutte le colonne definite nelle raccolte di colonne di output di una sequenza di componenti.During execution, the data flow task allocates PipelineBuffer objects that contain all the columns defined in the output column collections of a sequence of components. Ad esempio, se ognuno dei quattro componenti in una sequenza del flusso di dati aggiunge una colonna di output alla raccolta di colonne di output, il buffer fornito a ogni componente contiene quattro colonne, una per ogni colonna di output per componente.For example, if each of four components in a data flow sequence adds one output column to its output column collection,the buffer that is provided to each component contains four columns, one for each output column per component. A causa di questo comportamento, un componente a volte riceve buffer contenenti colonne che non utilizza.Because of this behavior, a component sometimes receives buffers that contain columns it does not use.

    Poiché i buffer ricevuti dal componente possono contenere colonne che il componente non utilizzerà, è necessario individuare le colonne che si desidera utilizzare nelle raccolte di colonne di input e output del componente nel buffer fornito al componente dall'attività Flusso di dati.Since the buffers received by your component may contain columns that the component will not use, you must locate the columns that you want to use in your component's input and output column collections in the buffer provided to the component by the data flow task. A tale scopo, utilizzare il metodo FindColumnByLineageID della proprietà BufferManager.You do this by using the FindColumnByLineageID method of the BufferManager property. Per motivi di prestazioni, questa attività viene in genere eseguita durante il metodo PreExecute, anziché in PrimeOutput o ProcessInput.For performance reasons, this task is ordinarily performed during the PreExecute method, rather than in PrimeOutput or ProcessInput.

    PreExecute viene chiamato prima dei metodi PrimeOutput e ProcessInput e rappresenta la prima opportunità per un componente di eseguire questa operazione dopo che BufferManager diventa disponibile per il componente.PreExecute is called before the PrimeOutput and ProcessInput methods, and is the first opportunity for a component to perform this work after the BufferManager becomes available to the component. Durante questo metodo, il componente deve individuare le proprie colonne nei buffer e archiviare questa informazione internamente affinché le colonne possano essere utilizzate nei metodi PrimeOutput o ProcessInput.During this method, the component should locate its columns in the buffers and store this information internally so the columns can be used in either the PrimeOutput or ProcessInput methods.

    Nell'esempio di codice seguente viene illustrata la modalità con cui un componente di trasformazione con output sincroni individua le proprie colonne di input nel buffer durante PreExecute.The following code example demonstrates how a transformation component with a synchronous output locates its input columns in the buffer during PreExecute.

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  

Aggiunta di righeAdding Rows

I componenti forniscono righe ai componenti a valle tramite l'aggiunta di righe agli oggetti PipelineBuffer.Components supply rows to downstream components by adding rows to PipelineBuffer objects. L'attività Flusso di dati fornisce una matrice di buffer di output, uno per ogni oggetto IDTSOutput100 connesso a un componente a valle, come parametro per il metodo PrimeOutput.The data flow task provides an array of output buffers - one for each IDTSOutput100 object that is connected to a downstream component - as a parameter to the PrimeOutput method. I componenti di origine e i componenti di trasformazione con output asincroni aggiungono righe ai buffer e quando hanno terminato chiamano il metodo SetEndOfRowset.Source components and transformation components with asynchronous outputs add rows to the buffers and call the SetEndOfRowset method when they are finished adding rows. L'attività Flusso di dati gestisce i buffer di output che fornisce ai componenti e, quando un buffer diventa pieno, sposta automaticamente le righe presenti al suo interno nel componente successivo.The data flow task manages the output buffers that it supplies to components and, as a buffer becomes full, automatically moves the rows in the buffer to the next component. Il metodo PrimeOutput viene chiamato una sola volta per ogni componente, a differenza del metodo ProcessInput che viene chiamato ripetutamente.The PrimeOutput method is called one time per component, unlike the ProcessInput method, which is called repeatedly.

Nell'esempio di codice seguente viene illustrata la modalità con cui un componente aggiunge righe ai propri buffer di output durante il metodo PrimeOutput, quindi chiama il metodo SetEndOfRowset.The following code example demonstrates how a component adds rows to its output buffers during the PrimeOutput method, then calls the SetEndOfRowset method.

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  

Per ulteriori informazioni sullo sviluppo di componenti che aggiungono righe ai buffer di output, vedere lo sviluppo di un componente di origine personalizzata e lo sviluppo di un componente di trasformazione personalizzato con output asincroni.For more information about developing components that add rows to output buffers, see Developing a Custom Source Component and Developing a Custom Transformation Component with Asynchronous Outputs.

Ricezione di righeReceiving Rows

I componenti ricevono righe dai componenti a monte in oggetti PipelineBuffer.Components receive rows from upstream components in PipelineBuffer objects. L'attività Flusso di dati fornisce un oggetto PipelineBuffer che contiene le righe aggiunte al flusso di dati dai componenti a monte come parametro per il metodo ProcessInput.The data flow task provides a PipelineBuffer object that contains the rows added to the data flow by upstream components as a parameter to the ProcessInput method. Questo buffer di input può essere utilizzato per esaminare e modificare le righe e le colonne nel buffer, ma non può essere utilizzato per aggiungere o rimuovere righe.This input buffer can be used to examine and modify the rows and columns in the buffer, but cannot be used to add or remove rows. Il metodo ProcessInput viene chiamato ripetutamente finché non sono più disponibili buffer.The ProcessInput method is called repeatedly until there are no more available buffers. L'ultima volta che viene chiamato, il EndOfRowset proprietà true.The last time it is called, the EndOfRowset property is true. È possibile scorrere la raccolta di righe nel buffer tramite il metodo NextRow, che fa avanzare il buffer alla riga successiva.You can iterate over the collection of rows in the buffer by using the NextRow method, which advances the buffer to the next row. Questo metodo restituisce false quando il buffer è nell'ultima riga nella raccolta.This method returns false when the buffer is on the last row in the collection. Non è necessario controllare la proprietà EndOfRowset a meno che non occorra eseguire un'azione aggiuntiva dopo l'elaborazione delle ultime righe di dati.You do not have to check the EndOfRowset property unless you have to perform an additional action after the last rows of data have been processed.

Nel testo riportato di seguito viene illustrato l'utilizzo corretto del metodo NextRow e della proprietà EndOfRowset:The following text shows the correct pattern for using the NextRow method and the EndOfRowset property:

while (buffer.NextRow())

{

// Do something with each row.

}

if (buffer.EndOfRowset)

{

// Optionally, do something after all rows have been processed.

}

Nell'esempio di codice seguente viene illustrata la modalità con cui un componente elabora le righe nei buffer di input durante il metodo ProcessInput.The following code example demonstrates how a component processes the rows in input buffers during the ProcessInput method.

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  

Per ulteriori informazioni sullo sviluppo di componenti che ricevono righe nei buffer di input, vedere lo sviluppo di un componente di destinazione personalizzato e lo sviluppo di un componente di trasformazione personalizzato con output sincroni.For more information about developing components that receive rows in input buffers, see Developing a Custom Destination Component and Developing a Custom Transformation Component with Synchronous Outputs.

Vedere ancheSee Also

Metodi della fase di progettazione di un componente flusso di datiDesign-time Methods of a Data Flow Component