Agregar componentes de flujo de datos mediante programación

Cuando se genera un flujo de datos, se inicia agregando componentes. A continuación, se configuran esos componentes y se conectan juntos para establecer el flujo de datos en tiempo de ejecución. En esta sección se describe cómo agregar un componente a la tarea de flujo de datos, crear la instancia del componente en tiempo de diseño y, a continuación, configurar el componente. Para obtener información acerca de cómo conectar componentes, vea Conectar componentes de flujo de datos mediante programación.

Agregar componentes

Llame al método New de la colección ComponentMetaDataCollection para crear un nuevo componente y agregarlo a la tarea de flujo de datos. Este método devuelve la interfaz IDTSComponentMetaData100 del componente. Sin embargo, en este punto, IDTSComponentMetaData100 no contiene información específica de ningún componente. Establezca la propiedad ComponentClassID para identificar el tipo de componente. La tarea de flujo de datos usa el valor de esta propiedad para crear una instancia del componente en tiempo de ejecución.

El valor especificado en la propiedad ComponentClassID puede ser la propiedad CLSID, PROGID o CreationName del componente. Normalmente, CLSID se muestra en la ventana Propiedades como el valor de la propiedad ComponentClassID del componente. Para obtener información acerca de cómo obtener esta propiedad y otras propiedades de componentes disponibles, vea Detectar componentes de flujo de datos mediante programación.

Agregar un componente administrado

No se puede usar la propiedad CLSID o PROGID para agregar uno de los componentes de flujo de datos administrados al flujo de datos, debido a que estos valores señalan a un contenedor y no al propio componente. En su lugar, se puede usar la propiedad CreationName o la propiedad AssemblyQualifiedName como se muestra en el ejemplo siguiente.

Si piensa usar la propiedad AssemblyQualifiedName, debe agregar en su proyecto de Visual Studio una referencia al ensamblado que contiene el componente administrado. Estos ensamblados no se enumeran en la ficha .NET del cuadro de diálogo Agregar referencia. Generalmente, debe ir a la carpeta C:\Archivos de programa\Microsoft SQL Server\100\DTS\PipelineComponents para encontrar el ensamblado.

Los componentes de flujo de datos administrados integrados incluyen:

  • Origen ADO.NET

  • Origen XML

  • Destino de DataReader

  • Destino de SQL Server Compact

  • Componente de script

En el siguiente ejemplo de código se muestran ambas maneras de agregar un componente administrado al flujo de datos:

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

Crear la instancia en tiempo de diseño del componente

Llame al método Instantiate para crear la instancia en tiempo de diseño del componente identificado por la propiedad ComponentClassID. Este método devuelve el objeto CManagedComponentWrapper, que es el contenedor administrado para la interfaz IDTSDesigntimeComponent100.

Siempre que sea posible, debería modificar un componente mediante los métodos de la instancia en tiempo de diseño, en lugar de modificando directamente los metadatos del componente. Aunque hay elementos en los metadatos que se deben establecer directamente, como conexiones, generalmente se recomienda modificar directamente los metadatos puesto que se omite la capacidad del componente para supervisar y validar los cambios.

Asignar conexiones

Algunos componentes, como el componente de origen de OLE DB, requieren una conexión a datos externos y usan un objeto ConnectionManager existente en el paquete para este propósito. La propiedad Count de la colección RuntimeConnectionCollection indica el número de objetos ConnectionManager en tiempo de ejecución que requiere el componente. Si el recuento es mayor que cero, el componente requiere una conexión. Asigne un administrador de conexiones del paquete al componente especificando las propiedades Name y ConnectionManager de la primera conexión en RuntimeConnectionCollection. Observe que el nombre del administrador de conexiones en la colección de conexión en tiempo de ejecución, debe coincidir con el nombre del administrador de conexionesal que se hace referencia desde el paquete.

Establecer los valores de propiedades personalizadas

Después de crear la instancia en tiempo de diseño del componente, llame al método ProvideComponentProperties. Este método es similar a un constructor porque inicializa un componente recién creado al crear sus propiedades personalizadas y sus objetos de entrada y salida. No llame a ProvideComponentProperties más de una vez en un componente porque el propio componente se puede restablecer y perder cualquier modificación realizada previamente en sus metadatos.

CustomPropertyCollection del componente contiene una colección de objetos IDTSCustomProperty100 específicos del componente. A diferencia de otros modelos de programación, donde las propiedades de un objeto siempre están visibles en el objeto, los componentes únicamente rellenan sus colecciones de propiedad personalizada al llamar al método ProvideComponentProperties. Después de llamar al método, use el método SetComponentProperty de la instancia en tiempo de diseño del componente para asignar valores a sus propiedades personalizadas. Este método acepta un par nombre/valor que identifica la propiedad personalizada y proporciona su nuevo valor.

Inicializar columnas de salida

Después de agregar un componente a la tarea y configurarlo, inicialice la colección de columnas en IDTSOutput100 del objeto. Este paso es especialmente relevante para los componentes de origen, pero puede que no inicialice las columnas para los componentes de transformación y destino, porque generalmente dependen de las columnas que reciben de los componentes de nivel superior.

Llame al método ReinitializeMetaData para inicializar las columnas en las salidas de un componente de origen. Dado que los componentes no se conectan automáticamente a los orígenes de datos externos, llame al método AcquireConnections antes de llamar ReinitializeMetaData, para proporcionar el acceso de componente a su origen de datos externo y la capacidad de rellenar sus metadatos de columna. Finalmente, llame al método ReleaseConnections para liberar la conexión.

Paso siguiente

Después de agregar y configurar el componente, el paso siguiente será crear rutas de acceso entre componentes, que se describe en el tema Crear una ruta de acceso entre dos componentes.

Ejemplo

En el siguiente ejemplo de código se agrega el componente de origen de OLE DB a una tarea de flujo de datos, se crea una instancia en tiempo de diseño del componente y se configuran las propiedades del componente. En este ejemplo se requiere una referencia adicional al ensamblado 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
Icono de Integration Services (pequeño) Manténgase al día con Integration Services

Para obtener las más recientes descargas, artículos, ejemplos y vídeos de Microsoft, así como soluciones seleccionadas de la comunidad, visite la página de Integration Services en MSDN o TechNet:

Para recibir notificaciones automáticas de estas actualizaciones, suscríbase a las fuentes RSS disponibles en la página.