Aggiunta di componenti del flusso di dati a livello di programmazioneAdding Data Flow Components Programmatically

Il primo passaggio per la compilazione di un flusso di dati consiste nell'aggiunta di componenti.When you build a data flow, you start by adding components. È quindi necessario configurarli e connetterli per stabilire il flusso di dati in fase di esecuzione.Then you configure those components and connect them together to establish the flow of data at run time. In questa sezione vengono descritti i passaggi per aggiungere un componente all'attività Flusso di dati, creare la relativa istanza della fase di progettazione e quindi configurarlo.This section describes adding a component to the data flow task, creating the design-time instance of the component, and then configuring the component. Per informazioni su come connettere i componenti, vedere connessione dati flusso componenti a livello di codice.For information about how to connect components, see Connecting Data Flow Components Programmatically.

Aggiunta di un componenteAdding a Component

Chiamare il metodo New della raccolta ComponentMetaDataCollection per creare un nuovo componente e aggiungerlo all'attività Flusso di dati.Call the New method of the ComponentMetaDataCollection collection to create a new component and add it to the data flow task. Questo metodo restituisce l'interfaccia IDTSComponentMetaData100 del componente.This method returns the IDTSComponentMetaData100 interface of the component. Tuttavia, a questo punto, IDTSComponentMetaData100 non contiene informazioni specifiche di un determinato componente.However, at this point, the IDTSComponentMetaData100 does not contain information specific to any one component. Impostare la proprietà ComponentClassID per identificare il tipo di componente.Set the ComponentClassID property to identify the type of component. L'attività Flusso di dati utilizza il valore di questa proprietà per creare un'istanza del componente in fase di esecuzione.The data flow task uses the value of this property to create an instance of the component at run time.

Il valore specificato nella proprietà ComponentClassID può essere il CLSID, il PROGID o la proprietà CreationName del componente.The value specified in the ComponentClassID property can be the CLSID, PROGID, or CreationName property of the component. Il CLSID viene in genere visualizzato nella finestra delle proprietà come valore della proprietà ComponentClassID del componente.The CLSID is normally displayed in the Properties window as the value of the component's ComponentClassID property. Per informazioni su come ottenere questa proprietà e altre proprietà dei componenti disponibili, vedere individuazione dati flusso componenti a livello di codice.For information about obtaining this property and other properties of available components, see Discovering Data Flow Components Programmatically.

Aggiunta di un componente gestitoAdding a Managed Component

Non è possibile utilizzare il CLSID o il PROGID per aggiungere uno dei componenti gestiti al flusso di dati, perché questi valori puntano a un wrapper e non al componente stesso.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. È invece possibile usare il CreationName proprietà o AssemblyQualifiedName proprietà come illustrato nell'esempio seguente.Instead you can use the CreationName property or the AssemblyQualifiedName property as shown in the following sample.

Se si prevede di usare il AssemblyQualifiedName proprietà, sarà necessario aggiungere un riferimento nel Visual StudioVisual Studio progetto all'assembly che contiene il componente gestito.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. Questi assembly non sono elencati nella scheda .NET della finestra di Aggiungi riferimento la finestra di dialogo.These assemblies are not listed on the .NET tab of the Add Reference dialog box. In genere è necessario cercare e per individuare l'assembly nel C:\Program Files\Microsoft SQL Server\100\DTS\PipelineComponents cartella.Normally you must browse to locate the assembly in the C:\Program Files\Microsoft SQL Server\100\DTS\PipelineComponents folder.

I componenti del flusso di dati gestiti predefiniti includono:The built-in managed data flow components include:

  • Origine ADO.NETADO.NET ADO.NETADO.NET Source

  • Origine XMLXML Source

  • DataReader - destinazioneDataReader Destination

  • SQL ServerSQL ServerDestinazione Compact Compact Destination

  • Componente scriptScript Component

    Nell'esempio di codice seguente sono illustrate entrambe le modalità di aggiunta di componenti gestiti al flusso di dati: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  

Creazione dell'istanza della fase di progettazione del componenteCreating the Design-time Instance of the Component

Chiamare il metodo Instantiate per creare l'istanza della fase di progettazione del componente identificato dalla proprietà ComponentClassID.Call the Instantiate method to create the design time instance of the component identified by the ComponentClassID property. Questo metodo restituisce l'oggetto CManagedComponentWrapper, che corrisponde al wrapper gestito per l'interfaccia IDTSDesigntimeComponent100.This method returns the CManagedComponentWrapper object, which is the managed wrapper for the IDTSDesigntimeComponent100 interface.

Se possibile, modificare un componente utilizzando i metodi dell'istanza della fase di progettazione anziché modificando direttamente i relativi metadati.Whenever possible, you should modify a component by using the methods of the design-time instance instead of by modifying the component metadata directly. Anche se alcuni elementi dei metadati devono essere impostati direttamente, ad esempio le connessioni, in genere non è consigliabile eseguire questa operazione perché in questo modo il componente non è più in grado di monitorare e convalidare le modifiche.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.

Assegnazione di connessioniAssigning Connections

Alcuni componenti, ad esempio il componente Origine OLE DB, richiedono una connessione a dati esterni e utilizzano un oggetto ConnectionManager esistente nel pacchetto a tale scopo.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. La proprietà Count della raccolta RuntimeConnectionCollection indica il numero di oggetti ConnectionManager di runtime richiesti dal componente.The Count property of the RuntimeConnectionCollection collection indicates the number of run-time ConnectionManager objects required by the component. Se il conteggio è maggiore di zero, il componente richiede una connessione.If the count is greater than zero, the component requires a connection. Assegnare una gestione connessione dal pacchetto al componente specificando le proprietà ConnectionManager e Name della prima connessione in RuntimeConnectionCollection.Assign a connection manager from the package to the component by specifying the ConnectionManager and Name properties of the first connection in the RuntimeConnectionCollection. Si noti che il nome della gestione connessione nella raccolta di connessione di run-time deve corrispondere al nome di managerreferenced la connessione dal pacchetto.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.

Impostazione dei valori delle proprietà personalizzateSetting the Values of Custom Properties

Dopo aver creato l'istanza della fase di progettazione del componente, chiamare il metodo ProvideComponentProperties.After creating the design-time instance of the component, call the ProvideComponentProperties method. Questo metodo è simile a un costruttore, in quanto inizializza un componente appena creato definendone le proprietà personalizzate e gli oggetti di input e output.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. Non chiamare ProvideComponentProperties più di una volta su un componente, perché il componente potrebbe reimpostarsi e perdere le modifiche apportate in precedenza ai propri metadati.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.

L'oggetto CustomPropertyCollection del componente contiene una raccolta di oggetti IDTSCustomProperty100 specifici del componente.The CustomPropertyCollection of the component contains a collection of IDTSCustomProperty100 objects specific to the component. A differenza di altri modelli di programmazione, in cui le proprietà di un oggetto sono sempre visibili sullo stesso, i componenti popolano le loro raccolte di proprietà personalizzate solo quando viene chiamato il metodo 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. Dopo aver chiamato il metodo, utilizzare il metodo SetComponentProperty dell'istanza della fase di progettazione del componente per assegnare valori alle relative proprietà personalizzate.After you call method, use the SetComponentProperty method of the design-time instance of the component to assign values to its custom properties. Questo metodo accetta una coppia nome/valore che identifica la proprietà personalizzata e fornisce il nuovo valore.This method accepts a name/value pair that identifies the custom property and provides its new value.

Inizializzazione di colonne di outputInitializing Output Columns

Dopo aver aggiunto un componente all'attività e dopo averlo configurato, inizializzare la raccolta di colonne in IDTSOutput100 dell'oggetto.After you add a component to the task and configure it, initialize the collection of columns in the IDTSOutput100 of the object. Questo passaggio è particolarmente importante per i componenti di origine, ma è possibile che non inizializzi le colonne per i componenti di trasformazione e destinazione, in quanto in genere dipendono dalle colonne che ricevono dai componenti a monte.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.

Chiamare il metodo ReinitializeMetaData per inizializzare le colonne negli output di un componente di origine.Call the ReinitializeMetaData method to initialize the columns in the outputs of a source component. Poiché i componenti non si connettono automaticamente alle origini dati esterne, chiamare il metodo AcquireConnections prima di chiamare ReinitializeMetaData per fornire al componente l'accesso all'origine dati esterna e la possibilità di popolare le proprie colonne di metadati.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. Infine, chiamare il metodo ReleaseConnections per rilasciare la connessione.Finally, call the ReleaseConnections method to release the connection.

Passaggio successivoNext Step

Dopo l'aggiunta e configurazione del componente, il passaggio successivo consiste nella creazione di percorsi tra componenti, come illustrato nell'argomento la creazione di un percorso tra due componenti.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.

EsempioSample

Nell'esempio di codice seguente viene aggiunto il componente Origine OLE DB all'attività Flusso di dati, viene creata un'istanza della fase di progettazione del componente e vengono configurate le relative proprietà.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. Per questo esempio è richiesto un riferimento aggiuntivo all'assembly 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  

Risorse esterneExternal Resources

Post di blog, Ezapi per SQL Server 2012, su blogs.msdn.com.Blog entry, EzAPI – Updated for SQL Server 2012, on blogs.msdn.com.

Vedere ancheSee Also

La connessione a livello di programmazione di componenti flusso di datiConnecting Data Flow Components Programmatically