Programmgesteuertes Hinzufügen von DatenflusskomponentenAdding Data Flow Components Programmatically

Wenn Sie einen Datenfluss erstellen, beginnen Sie, indem Sie Komponenten hinzufügen.When you build a data flow, you start by adding components. Anschließend werden diese Komponenten konfiguriert und miteinander verbunden, um den Datenfluss zur Laufzeit einzurichten.Then you configure those components and connect them together to establish the flow of data at run time. In diesem Abschnitt wird das Hinzufügen einer Komponente zum Datenflusstask, das Erstellen der Entwurfszeitinstanz der Komponente und das anschließende Konfigurieren der Komponente beschrieben.This section describes adding a component to the data flow task, creating the design-time instance of the component, and then configuring the component. Informationen zum Verbinden von Komponenten finden Sie unter Programmgesteuertes Verbinden von Datenflusskomponenten.For information about how to connect components, see Connecting Data Flow Components Programmatically.

Hinzufügen einer KomponenteAdding a Component

Rufen Sie die New-Methode der ComponentMetaDataCollection-Auflistung auf, um eine neue Komponente zu erstellen und diese dem Datenflusstask hinzuzufügen.Call the New method of the ComponentMetaDataCollection collection to create a new component and add it to the data flow task. Diese Methode gibt die IDTSComponentMetaData100-Schnittstelle der Komponente zurück.This method returns the IDTSComponentMetaData100 interface of the component. An diesem Punkt enthält die IDTSComponentMetaData100-Schnittstelle jedoch keine spezifischen Informationen zu einer der Komponenten.However, at this point, the IDTSComponentMetaData100 does not contain information specific to any one component. Legen Sie die ComponentClassID-Eigenschaft so fest, dass der Typ der Komponente identifiziert wird.Set the ComponentClassID property to identify the type of component. Der Datenflusstask verwendet den Wert dieser Eigenschaft zum Erstellen einer Instanz der Komponente zur Laufzeit.The data flow task uses the value of this property to create an instance of the component at run time.

Der in der ComponentClassID-Eigenschaft angegebene Wert kann die CLSID, PROGID oder CreationName-Eigenschaft der Komponente sein.The value specified in the ComponentClassID property can be the CLSID, PROGID, or CreationName property of the component. Die CLSID wird in der Regel im Eigenschaftenfenster als Wert der ComponentClassID-Eigenschaft der Komponente angezeigt.The CLSID is normally displayed in the Properties window as the value of the component's ComponentClassID property. Informationen zum Erhalten dieser Eigenschaft und anderer Eigenschaften verfügbarer Komponenten finden Sie unter Discovering Data Flow Components Programmatically (Programmgesteuertes Auffinden von Datenflusskomponenten).For information about obtaining this property and other properties of available components, see Discovering Data Flow Components Programmatically.

Hinzufügen einer verwalteten KomponenteAdding a Managed Component

Sie können die CLSID oder PROGID nicht verwenden, um dem Datenfluss eine der verwalteten Datenflusskomponenten hinzuzufügen, da diese Werte auf einen Wrapper und nicht auf die Komponente selbst zeigen.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. Stattdessen können Sie die CreationName-Eigenschaft oder die AssemblyQualifiedName-Eigenschaft verwenden, wie im folgenden Beispiel gezeigt.Instead you can use the CreationName property or the AssemblyQualifiedName property as shown in the following sample.

Wenn Sie die AssemblyQualifiedName-Eigenschaft verwenden möchten, müssen Sie in Ihrem Visual StudioVisual Studio-Projekt einen Verweis auf die Assembly hinzufügen, die die verwaltete Komponente enthält.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. Diese Assemblys sind nicht auf der Registerkarte für .NET des Dialogfelds Verweis hinzufügen aufgeführt.These assemblies are not listed on the .NET tab of the Add Reference dialog box. Normalerweise finden Sie die Assembly im Ordner C:\Programme\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.

Die integrierten verwalteten Datenflusskomponenten umfassen:The built-in managed data flow components include:

  • ADO.NETADO.NET-Quelle Source

  • XML-QuelleXML Source

  • DataReader-ZielDataReader Destination

  • SQL ServerSQL Server Compact-Ziel Compact Destination

  • SkriptkomponenteScript Component

    Im folgenden Codebeispiel werden beide Methoden zum Hinzufügen einer verwalteten Komponente zu einem Datenfluss veranschaulicht: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  

Erstellen der Entwurfszeitinstanz der KomponenteCreating the Design-time Instance of the Component

Rufen Sie die Instantiate-Methode zur Erstellung der Entwurfszeitinstanz der Komponente auf, die durch die ComponentClassID-Eigenschaft identifiziert wird.Call the Instantiate method to create the design time instance of the component identified by the ComponentClassID property. Diese Methode gibt das CManagedComponentWrapper-Objekt zurück, das der verwaltete Wrapper für die IDTSDesigntimeComponent100-Schnittstelle ist.This method returns the CManagedComponentWrapper object, which is the managed wrapper for the IDTSDesigntimeComponent100 interface.

Eine Komponente sollte, wann immer möglich, mithilfe der Methoden der Entwurfszeitinstanz geändert werden und nicht durch direktes Ändern der Metadaten der Komponente.Whenever possible, you should modify a component by using the methods of the design-time instance instead of by modifying the component metadata directly. Es gibt zwar Elemente in den Metadaten, die Sie direkt festlegen müssen, z. B. Verbindungen, es empfiehlt sich jedoch im Allgemeinen nicht, die Metadaten direkt zu ändern, da in diesem Fall die Komponente keine Änderungen mehr überwachen und überprüfen kann.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.

Zuweisen von VerbindungenAssigning Connections

Manche Komponenten, beispielsweise die OLE DB-Quellkomponente, erfordern eine Verbindung zu externen Daten und verwenden zu diesem Zweck ein vorhandenes ConnectionManager-Objekt in dem Paket.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. Die Count-Eigenschaft der .RuntimeConnectionCollection-Auflistung gibt die Anzahl von ConnectionManager-Objekten zur Laufzeit an, die für die Komponente erforderlich sind.The Count property of the RuntimeConnectionCollection collection indicates the number of run-time ConnectionManager objects required by the component. Wenn die Anzahl größer als 0 (null) ist, erfordert die Komponente eine Verbindung.If the count is greater than zero, the component requires a connection. Weisen Sie der Komponente einen Verbindungs-Manager aus dem Paket zu, indem Sie die ConnectionManager-Eigenschaft und die Name-Eigenschaft der ersten Verbindung in der RuntimeConnectionCollection angeben.Assign a connection manager from the package to the component by specifying the ConnectionManager and Name properties of the first connection in the RuntimeConnectionCollection. Beachten Sie, dass der Name des Verbindungs-Managers in der Verbindungsauflistung zur Laufzeit dem Namen des Verbindungs-Managers entsprechen muss, auf den vom Paket verwiesen wird.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.

Festlegen der Werte benutzerdefinierter EigenschaftenSetting the Values of Custom Properties

Rufen Sie nach dem Erstellen der Entwurfszeitinstanz der Komponente die ProvideComponentProperties-Methode auf.After creating the design-time instance of the component, call the ProvideComponentProperties method. Diese Methode ähnelt einem Konstruktor, da sie eine neu erstellte Komponente initialisiert, indem benutzerdefinierte Eigenschaften und Eingabe- und Ausgabeobjekte erstellt werden.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. Rufen Sie die ProvideComponentProperties-Methode nicht mehrmals in einer Komponente auf, da sich die Komponente möglicherweise selbst zurücksetzt und alle zuvor an ihren Metadaten vorgenommenen Änderungen verloren gehen.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.

Die CustomPropertyCollection-Eigenschaft der Komponente enthält eine Auflistung von IDTSCustomProperty100-Objekten, die für die Komponente spezifisch sind.The CustomPropertyCollection of the component contains a collection of IDTSCustomProperty100 objects specific to the component. Im Gegensatz zu anderen Programmierungsmodellen, bei denen die Eigenschaften eines Objekts in dem Objekt immer sichtbar sind, werden die Auflistungen benutzerdefinierter Eigenschaften von Komponenten nur aufgefüllt, wenn Sie die ProvideComponentProperties-Methode aufrufen.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. Verwenden Sie nach dem Aufrufen der Methode die SetComponentProperty-Methode der Entwurfszeitinstanz der Komponente, um ihren benutzerdefinierten Eigenschaften Werte zuzuweisen.After you call method, use the SetComponentProperty method of the design-time instance of the component to assign values to its custom properties. Diese Methode akzeptiert ein Name/Wert-Paar, das die benutzerdefinierte Eigenschaft identifiziert und seinen neuen Wert bereitstellt.This method accepts a name/value pair that identifies the custom property and provides its new value.

Initialisieren von AusgabespaltenInitializing Output Columns

Nachdem Sie dem Task eine Komponente hinzugefügt und diese konfiguriert haben, initialisieren Sie die Auflistung von Spalten in IDTSOutput100 des Objekts.After you add a component to the task and configure it, initialize the collection of columns in the IDTSOutput100 of the object. Dieser Schritt ist insbesondere bei Quellkomponenten relevant. Möglicherweise werden dadurch jedoch keine Spalten für die Transformation und Zielkomponenten initialisiert, da diese im Allgemeinen von den Spalten abhängig sind, die sie von Upstreamkomponenten empfangen.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.

Rufen Sie die ReinitializeMetaData-Methode auf, um die Spalten in den Ausgaben einer Quellkomponente zu initialisieren.Call the ReinitializeMetaData method to initialize the columns in the outputs of a source component. Da Komponenten nicht automatisch eine Verbindung zu externen Datenquellen herstellen, rufen Sie die AcquireConnections-Methode auf, bevor Sie die ReinitializeMetaData-Methode aufrufen, um der Komponente Zugriff zu ihrer externen Datenquelle zu gewähren und die Möglichkeit zu geben, ihre eigene Metadatenspalte zu füllen.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. Um die Verbindung freizugeben, ist schließlich ein Aufruf der ReleaseConnections-Methode erforderlich.Finally, call the ReleaseConnections method to release the connection.

Nächster SchrittNext Step

Nach dem Hinzufügen und Konfigurieren der Komponente besteht der nächste Schritt darin, Pfade zwischen Komponenten zu erstellen. Dies wird im Thema Creating a Path (Erstellen eines Pfads) erläutert.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.

BeispielSample

Im folgenden Codebeispiel werden die OLE DB-Quellkomponenten einem Datenflusstask hinzugefügt, eine Entwurfszeitinstanz der Komponente erstellt und die Eigenschaften der Komponente konfiguriert.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. Für dieses Beispiel ist ein zusätzlicher Verweis auf die Microsoft.SqlServer.SQLTask-Assembly erforderlich.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  

Externe RessourcenExternal Resources

Blogeintrag, EzAPI – Updated for SQL Server 2012 (EzAPI – aktualisiert für SQL Server 2012), auf blogs.msdn.com.Blog entry, EzAPI – Updated for SQL Server 2012, on blogs.msdn.com.

Weitere Informationen finden Sie unterSee Also

Programmgesteuertes Verbinden von DatenflusskomponentenConnecting Data Flow Components Programmatically