프로그래밍 방식으로 데이터 흐름 구성 요소 추가Adding Data Flow Components Programmatically

데이터 흐름을 작성할 때는 먼저 구성 요소를 추가합니다.When you build a data flow, you start by adding components. 그런 다음 해당 구성 요소를 구성하고 서로 연결하여 런타임에 데이터의 흐름을 구성합니다.Then you configure those components and connect them together to establish the flow of data at run time. 이 섹션에서는 데이터 흐름 태스크에 구성 요소를 추가하고 해당 구성 요소의 디자인 타임 인스턴스를 만든 다음 구성 요소를 구성하는 방법을 설명합니다.This section describes adding a component to the data flow task, creating the design-time instance of the component, and then configuring the component. 구성 요소를 연결 하는 방법에 대 한 정보를 참조 하십시오. 연결 데이터 흐름 구성 요소 프로그래밍 방식으로합니다.For information about how to connect components, see Connecting Data Flow Components Programmatically.

구성 요소 추가Adding a Component

New 컬렉션의 ComponentMetaDataCollection 메서드를 호출하여 새 구성 요소를 만들고 이를 데이터 흐름 태스크에 추가할 수 있습니다.Call the New method of the ComponentMetaDataCollection collection to create a new component and add it to the data flow task. 이 메서드는 구성 요소의 IDTSComponentMetaData100 인터페이스를 반환합니다.This method returns the IDTSComponentMetaData100 interface of the component. 하지만 이 시점에서 IDTSComponentMetaData100에는 구성 요소와 관련된 정보가 들어 있지 않습니다.However, at this point, the IDTSComponentMetaData100 does not contain information specific to any one component. 구성 요소의 형식을 식별하려면 ComponentClassID 속성을 설정합니다.Set the ComponentClassID property to identify the type of component. 데이터 흐름 태스크에서는 런타임에 이 속성 값을 사용하여 구성 요소의 인스턴스를 만듭니다.The data flow task uses the value of this property to create an instance of the component at run time.

ComponentClassID 속성에 지정된 값은 CLSID, PROGID 또는 구성 요소의 CreationName 속성일 수 있습니다.The value specified in the ComponentClassID property can be the CLSID, PROGID, or CreationName property of the component. CLSID는 일반적으로 속성 창에서 구성 요소의 ComponentClassID 속성 값으로 표시됩니다.The CLSID is normally displayed in the Properties window as the value of the component's ComponentClassID property. 이 속성 및 기타 사용 가능한 구성 요소 속성을 가져오는 방법은 참조 하십시오. 검색 데이터 흐름 구성 요소 프로그래밍 방식으로합니다.For information about obtaining this property and other properties of available components, see Discovering Data Flow Components Programmatically.

관리되는 구성 요소 추가Adding a Managed Component

CLSID나 PROGID는 구성 요소 자체가 아니라 래퍼를 가리키므로 이러한 값을 사용하여 데이터 흐름에 관리되는 데이터 흐름 구성 요소를 추가할 수는 없습니다.You cannot use the CLSID or PROGID to add one the managed data flow components to the data flow, because these values point to a wrapper and not to the component itself. 대신 사용할 수 있습니다는 CreationName 속성 또는 AssemblyQualifiedName 속성은 다음 예에서 같이 합니다.Instead you can use the CreationName property or the AssemblyQualifiedName property as shown in the following sample.

사용 하려는 경우는 AssemblyQualifiedName 속성을 다음에 대 한 참조를 추가 해야 프로그램 Visual StudioVisual Studio 관리 되는 구성 요소를 포함 하는 어셈블리에 대 한 프로젝트입니다.If you intend to use the AssemblyQualifiedName property, then you must add a reference in your Visual StudioVisual Studio project to the assembly that contains the managed component. 이러한 어셈블리는.NET 탭에 표시 되지 않습니다는 참조 추가 대화 상자.These assemblies are not listed on the .NET tab of the Add Reference dialog box. 에 어셈블리를 찾는 찾아보기 해야 하는 일반적으로 C:\Program Files\Microsoft SQL Server\100\DTS\PipelineComponents 폴더입니다.Normally you must browse to locate the assembly in the C:\Program Files\Microsoft SQL Server\100\DTS\PipelineComponents folder.

기본 제공되는 관리되는 데이터 흐름 구성 요소에는 다음이 포함됩니다.The built-in managed data flow components include:

  • ADO.NETADO.NET 원본 Source

  • XML 원본XML Source

  • DataReader 대상DataReader Destination

  • SQL ServerSQL ServerCompact 대상 Compact Destination

  • 스크립트 구성 요소Script Component

    다음 코드 예제에서는 데이터 흐름에 관리되는 구성 요소를 추가하는 두 가지 방법을 모두 보여 줍니다.The following code sample shows both ways of adding a managed component to the data flow:

using System;  
using Microsoft.SqlServer.Dts.Runtime;  
using Microsoft.SqlServer.Dts.Pipeline;  
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;  

namespace Microsoft.SqlServer.Dts.Samples  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
      Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package();  
      Executable e = package.Executables.Add("STOCK:PipelineTask");  
      Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = (Microsoft.SqlServer.Dts.Runtime.TaskHost)e;  
      MainPipe dataFlowTask = (MainPipe)thMainPipe.InnerObject;  

      // The Application object will be used to obtain the CreationName  
      //  of a PipelineComponentInfo from its PipelineComponentInfos collection.  
      Application app = new Application();  

      // Add a first ADO NET source to the data flow.  
      //  The CreationName property requires an Application instance.  
      IDTSComponentMetaData100 component1 = dataFlowTask.ComponentMetaDataCollection.New();  
      component1.Name = "DataReader Source";  
      component1.ComponentClassID = app.PipelineComponentInfos["DataReader Source"].CreationName;  

      // Add a second ADO NET source to the data flow.  
      //  The AssemblyQualifiedName property requires a reference to the assembly.  
      IDTSComponentMetaData100 component2 = dataFlowTask.ComponentMetaDataCollection.New();  
      component2.Name = "DataReader Source";  
      component2.ComponentClassID = typeof(Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter).AssemblyQualifiedName;  
    }  
  }  
}  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports Microsoft.SqlServer.Dts.Pipeline  
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper  

Module Module1  

  Sub Main()  

    Dim package As Microsoft.SqlServer.Dts.Runtime.Package = _  
      New Microsoft.SqlServer.Dts.Runtime.Package()  
    Dim e As Executable = package.Executables.Add("STOCK:PipelineTask")  
    Dim thMainPipe As Microsoft.SqlServer.Dts.Runtime.TaskHost = _  
      CType(e, Microsoft.SqlServer.Dts.Runtime.TaskHost)  
    Dim dataFlowTask As MainPipe = CType(thMainPipe.InnerObject, MainPipe)  

    ' The Application object will be used to obtain the CreationName  
    '  of a PipelineComponentInfo from its PipelineComponentInfos collection.  
    Dim app As New Application()  

    ' Add a first ADO NET source to the data flow.  
    '  The CreationName property requires an Application instance.  
    Dim component1 As IDTSComponentMetaData100 = _  
      dataFlowTask.ComponentMetaDataCollection.New()  
    component1.Name = "DataReader Source"  
    component1.ComponentClassID = app.PipelineComponentInfos("DataReader Source").CreationName  

    ' Add a second ADO NET source to the data flow.  
    '  The AssemblyQualifiedName property requires a reference to the assembly.  
    Dim component2 As IDTSComponentMetaData100 = _  
      dataFlowTask.ComponentMetaDataCollection.New()  
    component2.Name = "DataReader Source"  
    component2.ComponentClassID = _  
      GetType(Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter).AssemblyQualifiedName  

  End Sub  

End Module  

구성 요소의 디자인 타임 인스턴스 만들기Creating the Design-time Instance of the Component

Instantiate 메서드를 호출하여 ComponentClassID 속성으로 식별된 구성 요소의 디자인 타임 인스턴스를 만들 수 있습니다.Call the Instantiate method to create the design time instance of the component identified by the ComponentClassID property. 이 메서드는 CManagedComponentWrapper 인터페이스의 관리되는 래퍼인 IDTSDesigntimeComponent100 개체를 반환합니다.This method returns the CManagedComponentWrapper object, which is the managed wrapper for the IDTSDesigntimeComponent100 interface.

가능하면 항상 구성 요소 메타데이터를 직접 수정하는 대신 디자인 타임 인스턴스의 메서드를 사용하여 구성 요소를 수정해야 합니다.Whenever possible, you should modify a component by using the methods of the design-time instance instead of by modifying the component metadata directly. 메타데이터에는 연결과 같이 직접 설정해야 하는 항목도 있지만 일반적으로 메타데이터를 직접 수정할 경우에는 구성 요소의 변경 내용 모니터링 및 유효성 검사 기능을 사용할 수 없으므로 이 방법은 권장되지 않습니다.Although there are items in the metadata that you must set directly, such as connections, generally it is inadvisable to modify the metadata directly because you bypass the ability of the component to monitor and validate changes.

연결 할당Assigning Connections

OLE DB 원본 구성 요소와 같은 일부 구성 요소에서는 외부 데이터에 연결해야 하며 이 용도로 패키지의 기존 ConnectionManager 개체를 사용합니다.Some components, such as the OLE DB Source component, require a connection to external data and use an existing ConnectionManager object in the package for this purpose. Count 컬렉션의 RuntimeConnectionCollection 속성은 구성 요소에 필요한 런타임 ConnectionManager 개체의 수를 나타냅니다.The Count property of the RuntimeConnectionCollection collection indicates the number of run-time ConnectionManager objects required by the component. 이 수가 0보다 크면 해당 구성 요소에는 연결이 필요합니다.If the count is greater than zero, the component requires a connection. ConnectionManager에 있는 첫 번째 연결의 NameRuntimeConnectionCollection 속성을 지정하면 패키지의 연결 관리자를 구성 요소에 할당할 수 있습니다.Assign a connection manager from the package to the component by specifying the ConnectionManager and Name properties of the first connection in the RuntimeConnectionCollection. 런타임 연결 컬렉션에서 연결 관리자의 이름을 패키지에서 연결 managerreferenced의 이름과 일치 해야 하는 참고 합니다.Note that the name of the connection manager in the run-time connection collection must match the name of the connection managerreferenced from the package.

사용자 지정 속성 값 설정Setting the Values of Custom Properties

구성 요소의 디자인 타임 인스턴스를 만든 후에는 ProvideComponentProperties 메서드를 호출합니다.After creating the design-time instance of the component, call the ProvideComponentProperties method. 이 메서드는 사용자 지정 속성과 입력 및 출력 개체를 만들어 새로 만든 구성 요소를 초기화하므로 생성자와 비슷합니다.This method is similar to a constructor because it initializes a newly created component by creating its custom properties and its input and output objects. 한 구성 요소에 대해 ProvideComponentProperties를 두 번 이상 호출하면 구성 요소가 다시 설정되고 이전의 메타데이터 수정 내용을 잃을 수 있으므로 이 메서드는 한 번만 호출해야 합니다.Do not call ProvideComponentProperties more than one time on a component, because the component may reset itself and lose any modifications previously made to its metadata.

구성 요소의 CustomPropertyCollection에는 해당 구성 요소와 관련된 IDTSCustomProperty100 개체의 컬렉션이 들어 있습니다.The CustomPropertyCollection of the component contains a collection of IDTSCustomProperty100 objects specific to the component. 개체 속성을 해당 개체에서 항상 볼 수 있는 다른 프로그래밍 모델과 달리 구성 요소는 개발자가 ProvideComponentProperties 메서드를 호출할 때 해당 구성 요소의 사용자 지정 속성 컬렉션만 채웁니다.Unlike other programming models, where the properties of an object are always visible on the object, components only populate their custom property collections when you call the ProvideComponentProperties method. 메서드를 호출한 후에는 디자인 타임 구성 요소 인스턴스의 SetComponentProperty 메서드를 사용하여 사용자 지정 속성에 값을 할당합니다.After you call method, use the SetComponentProperty method of the design-time instance of the component to assign values to its custom properties. 이 메서드는 사용자 지정 속성을 식별하고 새 값을 제공하는 이름/값 쌍을 받아들입니다.This method accepts a name/value pair that identifies the custom property and provides its new value.

출력 열 초기화Initializing Output Columns

구성 요소를 태스크에 추가하고 구성한 후에는 개체의 IDTSOutput100에서 열 컬렉션을 초기화합니다.After you add a component to the task and configure it, initialize the collection of columns in the IDTSOutput100 of the object. 이 단계는 특히 원본 구성 요소와 관련이 있지만 변환 및 대상 구성 요소는 일반적으로 업스트림 구성 요소에서 받는 열에 의존하므로 이러한 구성 요소의 열은 초기화하지 않을 수 있습니다.This step is especially relevant for source components, but may not initialize the columns for transformation and destination components because they generally depend on the columns that they receive from upstream components.

원본 구성 요소의 출력에 있는 열을 초기화하려면 ReinitializeMetaData 메서드를 호출합니다.Call the ReinitializeMetaData method to initialize the columns in the outputs of a source component. 구성 요소에서는 외부 데이터 원본에 자동으로 연결하지 않으므로 구성 요소에서 외부 데이터 원본에 액세스하고 해당 열 메타데이터를 채울 수 있도록 하려면 AcquireConnections를 호출하기 전에 ReinitializeMetaData 메서드를 호출해야 합니다.Because components do not automatically connect to external data sources, call the AcquireConnections method before calling ReinitializeMetaData to provide the component access to its external data source and the ability to populate its column metadata. 마지막으로 ReleaseConnections 메서드를 호출하여 연결을 해제합니다.Finally, call the ReleaseConnections method to release the connection.

다음 단계Next Step

추가 구성 요소를 구성 하는 후 다음 단계에서에서 설명 하는 항목, 구성 요소 간의 경로를 만드는 것 는 경로 간의 두 구성 요소를 만드는합니다.After adding and configuring the component, the next step is to create paths between components, which is discussed in the topic, Creating a Path Between Two Components.

예제Sample

다음 코드 예제에서는 데이터 흐름 태스크에 OLE DB 원본 구성 요소를 추가하고 해당 구성 요소의 디자인 타임 인스턴스를 만든 다음 구성 요소의 속성을 구성합니다.The following code sample adds the OLE DB Source component to a data flow task, creates a design-time instance of the component, and configures the component's properties. 이 예에는 Microsoft.SqlServer.DTSRuntimeWrap 어셈블리에 대한 참조가 필요합니다.This example requires an additional reference to the assembly Microsoft.SqlServer.DTSRuntimeWrap.

using System;  
using Microsoft.SqlServer.Dts.Runtime;  
using Microsoft.SqlServer.Dts.Runtime.Wrapper;  
using Microsoft.SqlServer.Dts.Pipeline;  
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;  

namespace Microsoft.SqlServer.Dts.Samples  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
      Runtime.Package package = new Runtime.Package();  
      Executable e = package.Executables.Add("STOCK:PipelineTask");  
      Runtime.TaskHost thMainPipe = e as Runtime.TaskHost;  
      MainPipe dataFlowTask = thMainPipe.InnerObject as MainPipe;  

      // Add an OLEDB connection manager to the package.  
      ConnectionManager cm = package.Connections.Add("OLEDB");  
      cm.Name = "OLEDB ConnectionManager";  
      cm.ConnectionString = "Data Source=(local);" +   
        "Initial Catalog=AdventureWorks;Provider=SQLOLEDB.1;" +   
        "Integrated Security=SSPI;"  

      // Add an OLE DB source to the data flow.  
      IDTSComponentMetaData100 component =   
        dataFlowTask.ComponentMetaDataCollection.New();  
      component.Name = "OLEDBSource";  
      component.ComponentClassID = "DTSAdapter.OleDbSource.1";  
      // You can also use the CLSID of the component instead of the PROGID.  
      //component.ComponentClassID = "{2C0A8BE5-1EDC-4353-A0EF-B778599C65A0}";  

      // Get the design time instance of the component.  
      CManagedComponentWrapper instance = component.Instantiate();  

      // Initialize the component  
      instance.ProvideComponentProperties();  

      // Specify the connection manager.  
      if (component.RuntimeConnectionCollection.Count > 0)  
      {  
        component.RuntimeConnectionCollection[0].ConnectionManager =   
          DtsConvert.GetExtendedInterface(package.Connections[0]);  
        component.RuntimeConnectionCollection[0].ConnectionManagerID =   
          package.Connections[0].ID;      }  

      // Set the custom properties.  
      instance.SetComponentProperty("AccessMode", 2);  
      instance.SetComponentProperty("SqlCommand",   
        "Select * from Production.Product");  

      // Reinitialize the metadata.  
      instance.AcquireConnections(null);  
      instance.ReinitializeMetaData();  
      instance.ReleaseConnections();  

      // Add other components to the data flow and connect them.  
    }  
  }  
}  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper  
Imports Microsoft.SqlServer.Dts.Pipeline  
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper  

Module Module1  

  Sub Main()  

    Dim package As Microsoft.SqlServer.Dts.Runtime.Package = _  
      New Microsoft.SqlServer.Dts.Runtime.Package()  
    Dim e As Executable = package.Executables.Add("STOCK:PipelineTask")  
    Dim thMainPipe As Microsoft.SqlServer.Dts.Runtime.TaskHost = _  
      CType(e, Microsoft.SqlServer.Dts.Runtime.TaskHost)  
    Dim dataFlowTask As MainPipe = CType(thMainPipe.InnerObject, MainPipe)  

    ' Add an OLEDB connection manager to the package.  
    Dim cm As ConnectionManager = package.Connections.Add("OLEDB")  
    cm.Name = "OLEDB ConnectionManager"  
    cm.ConnectionString = "Data Source=(local);" & _  
      "Initial Catalog=AdventureWorks;Provider=SQLOLEDB.1;" & _  
      "Integrated Security=SSPI;"  

    ' Add an OLE DB source to the data flow.  
    Dim component As IDTSComponentMetaData100 = _  
      dataFlowTask.ComponentMetaDataCollection.New()  
    component.Name = "OLEDBSource"  
    component.ComponentClassID = "DTSAdapter.OleDbSource.1"  
    ' You can also use the CLSID of the component instead of the PROGID.  
    'component.ComponentClassID = "{2C0A8BE5-1EDC-4353-A0EF-B778599C65A0}";  

    ' Get the design time instance of the component.  
    Dim instance As CManagedComponentWrapper = component.Instantiate()  

    ' Initialize the component.  
    instance.ProvideComponentProperties()  

    ' Specify the connection manager.  
    If component.RuntimeConnectionCollection.Count > 0 Then  
      component.RuntimeConnectionCollection(0).ConnectionManager = _  
        DtsConvert.GetExtendedInterface(package.Connections(0))  
      component.RuntimeConnectionCollection(0).ConnectionManagerID = _  
        package.Connections(0).ID  
    End If  

    ' Set the custom properties.  
    instance.SetComponentProperty("AccessMode", 2)  
    instance.SetComponentProperty("SqlCommand", _  
      "Select * from Production.Product")  

    ' Reinitialize the metadata.  
    instance.AcquireConnections(vbNull)  
    instance.ReinitializeMetaData()  
    instance.ReleaseConnections()  

    ' Add other components to the data flow and connect them.  

  End Sub  

End Module  

외부 리소스External Resources

블로그 항목- EzAPI – SQL Server 2012에 대 한 업데이트, blogs.msdn.com에서 합니다.Blog entry, EzAPI – Updated for SQL Server 2012, on blogs.msdn.com.

관련 항목:See Also

데이터 흐름 구성 요소를 프로그래밍 방식으로 연결Connecting Data Flow Components Programmatically