데이터 흐름 구성 요소의 런타임 메서드Run-time Methods of a Data Flow Component

런타임에 데이터 흐름 태스크에서는 구성 요소의 시퀀스를 검사하고, 실행 계획을 준비하고, 작업 계획을 실행하는 작업자 스레드의 풀을 관리합니다.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. 또한 원본에서 데이터 행을 로드하고 이를 변환을 통해 처리한 다음 대상에 저장합니다.The task loads rows of data from sources, processes them through transformations, then saves them to destinations.

메서드 실행 순서Sequence of Method Execution

데이터 흐름 구성 요소를 실행하는 동안에는 PipelineComponent 기본 클래스에 포함된 일련의 메서드가 호출됩니다.During the execution of a data flow component, a subset of the methods in the PipelineComponent base class is called. 이러한 메서드와 메서드가 호출되는 순서는 PrimeOutputProcessInput 메서드만 제외하고 항상 동일합니다.The methods, and the sequence in which they are called, are always the same, with the exception of the PrimeOutput and ProcessInput methods. 이 두 메서드가 호출되는 방식은 구성 요소의 IDTSInput100IDTSOutput100 개체가 있는지 여부와 해당 구성에 따라 다릅니다.These two methods are called based on the existence and configuration of a component's IDTSInput100 and IDTSOutput100 objects.

다음 목록에서는 구성 요소가 실행되는 동안 호출되는 메서드를 호출 순서대로 보여 줍니다.The following list shows the methods in the order in which they are called during component execution. PrimeOutput이 호출될 때는 항상 ProcessInput보다 먼저 호출됩니다.Note that PrimeOutput, when called, is always called before ProcessInput.

PrimeOutput 메서드PrimeOutput Method

PrimeOutput 메서드는 구성 요소에 IDTSPath100 개체를 통해 다운스트림 구성 요소에 연결된 출력이 하나 이상 있고 이 출력의 SynchronousInputID 속성이 0인 경우에 호출됩니다.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. 비동기 출력을 사용하는 원본 구성 요소 및 변환의 경우에는 PrimeOutput이 호출됩니다.The PrimeOutput method is called for source components and for transformations with asynchronous outputs. 아래에 설명된 ProcessInput 메서드와 달리 PrimeOutput 메서드는 해당 메서드가 필요한 각 구성 요소에 대해 한 번씩만 호출됩니다.Unlike the ProcessInput method described below, the PrimeOutput method is only called once for each component that requires it.

ProcessInput 메서드ProcessInput Method

ProcessInput 메서드는 IDTSPath100 개체를 통해 업스트림 구성 요소에 연결된 하나 이상의 입력이 있는 구성 요소에 대해 호출됩니다.The ProcessInput method is called for components that have at least one input attached to an upstream component by an IDTSPath100 object. ProcessInput 메서드는 대상 구성 요소와 동기 출력을 사용하는 변환에 대해 호출됩니다The ProcessInput method is called for destination components and for transformations with synchronous outputs. ProcessInput은 업스트림 구성 요소에서 더 이상 처리할 행이 없을 때까지 반복적으로 호출됩니다.ProcessInput is called repeatedly until there are no more rows to process from upstream components.

입/출력 작업Working with Inputs and Outputs

런타임에 데이터 흐름 구성 요소에서는 다음 태스크를 수행합니다.At run time, data flow components perform the following tasks:

  • 원본 구성 요소가 행을 추가합니다.Source components add rows.

  • 동기 출력을 사용하는 변환 구성 요소가 원본 구성 요소에서 제공된 행을 받습니다.Transformation components with synchronous outputs receive rows provided by source components.

  • 비동기 출력을 사용하는 변환 구성 요소가 행을 받고 추가합니다.Transformation components with asynchronous outputs receive rows and add rows.

  • 대상 구성 요소가 행을 받은 다음 대상으로 로드합니다.Destination components receive rows and then load them into a destination.

    실행 중 데이터 흐름 태스크에서는 구성 요소 시퀀스의 출력 열 컬렉션에 정의된 모든 열이 포함된 PipelineBuffer를 할당합니다.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. 예를 들어 데이터 흐름 시퀀스에 있는 네 개의 구성 요소가 각각 해당 출력 열 컬렉션에서 출력 열을 하나씩 추가할 경우 각 구성 요소에 제공된 버퍼에는 이 네 개의 출력 열이 모두 포함됩니다.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. 이 동작으로 인해 구성 요소가 받는 버퍼에 해당 구성 요소에서 사용하지 않는 열이 포함된 경우가 종종 있습니다.Because of this behavior, a component sometimes receives buffers that contain columns it does not use.

    구성 요소가 받는 버퍼에는 해당 구성 요소에서 사용하지 않는 열이 포함되는 경우가 있으므로 구성 요소의 입력 및 출력 열 컬렉션에 사용할 열은 데이터 흐름 태스크가 해당 구성 요소에 제공한 버퍼에서 찾아야 합니다.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. 이렇게 하려면 FindColumnByLineageID 속성의 BufferManager 메서드를 사용합니다.You do this by using the FindColumnByLineageID method of the BufferManager property. 성능상의 이유로 이 태스크는 일반적으로 PreExecute 또는 PrimeOutput 대신 ProcessInput 메서드에서 수행됩니다.For performance reasons, this task is ordinarily performed during the PreExecute method, rather than in PrimeOutput or ProcessInput.

    PreExecutePrimeOutputProcessInput 메서드보다 먼저 호출되므로 구성 요소에서 BufferManager를 사용할 수 있게 된 후 이 작업을 수행할 수 있는 첫 번째 메서드는 이 메서드입니다.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. 이 메서드가 실행될 때 구성 요소는 버퍼에서 해당 구성 요소의 열을 찾고 PrimeOutput 또는 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.

    다음 코드 예에서는 동기 출력을 사용하는 변환 구성 요소가 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  

행 추가Adding Rows

구성 요소에서는 PipelineBuffer 개체에 행을 추가하는 방법으로 다운스트림 구성 요소에 행을 제공합니다.Components supply rows to downstream components by adding rows to PipelineBuffer objects. 데이터 흐름 태스크에서는 다운스트림 구성 요소에 연결된 각 IDTSOutput100 개체에 대한 출력 버퍼가 하나씩 포함된 출력 버퍼 배열을 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. 원본 구성 요소와 비동기 출력을 사용하는 변환 구성 요소에서는 버퍼에 행을 추가하고 행 추가가 완료되면 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. 데이터 흐름 태스크에서는 해당 태스크가 구성 요소에 제공한 출력 버퍼를 관리하고 버퍼가 가득 차면 해당 버퍼의 행을 자동으로 다음 구성 요소로 이동합니다.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. PrimeOutput 메서드는 반복적으로 호출되는 ProcessInput 메서드와 달리 구성 요소마다 한 번씩 호출됩니다.The PrimeOutput method is called one time per component, unlike the ProcessInput method, which is called repeatedly.

다음 코드 예에서는 구성 요소에서 PrimeOutput 메서드 실행 중 출력 버퍼에 행을 추가한 다음 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  

출력 버퍼에 행을 추가 하는 구성 요소를 개발 하는 방법에 대 한 자세한 내용은 참조 사용자 지정 원본 구성 요소 개발비동기 출력을 사용자 지정 변환 구성 요소 개발합니다.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.

파일 받기Receiving Rows

구성 요소는 PipelineBuffer 개체에서 업스트림 구성 요소의 행을 받습니다.Components receive rows from upstream components in PipelineBuffer objects. 데이터 흐름 태스크에서는 업스트림 구성 요소가 PipelineBuffer 메서드에 대한 매개 변수로 데이터 흐름에 추가한 행이 들어 있는 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. 이 입력 버퍼를 사용하여 버퍼의 행 및 열을 검사하거나 수정할 수 있지만 행을 추가하거나 제거할 수는 없습니다.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. ProcessInput 메서드는 사용할 수 없는 버퍼가 더 이상 없을 때까지 반복적으로 호출됩니다.The ProcessInput method is called repeatedly until there are no more available buffers. 마지막으로 호출 되는 EndOfRowset 속성은 true합니다.The last time it is called, the EndOfRowset property is true. 버퍼 내에서 다음 행으로 진행하는 NextRow 메서드를 사용하면 버퍼의 행 컬렉션을 반복할 수 있습니다.You can iterate over the collection of rows in the buffer by using the NextRow method, which advances the buffer to the next row. 이 메서드가 반환 false 버퍼가 컬렉션의 마지막 행에 있는 경우.This method returns false when the buffer is on the last row in the collection. 마지막 데이터 행이 처리된 후 추가 동작을 수행해야 하는 경우가 아니면 EndOfRowset 속성을 확인할 필요가 없습니다.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.

다음 텍스트는 NextRow 메서드와 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.

}

다음 코드 예에서는 구성 요소에서 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  

입력된 버퍼에서 행을 받는 구성 요소를 개발 하는 방법에 대 한 자세한 내용은 참조 사용자 지정 대상 구성 요소 개발동기 출력을 사용자 지정 변환 구성 요소 개발합니다.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.

관련 항목:See Also

데이터 흐름 구성 요소의 디자인 타임 메서드Design-time Methods of a Data Flow Component