Compartir a través de


Crear un destino con el componente de script

Los componentes de destino se utilizan en el flujo de datos de un paquete de Integration Services para guardar datos recibidos de orígenes y transformaciones de nivel superior en un origen de datos. Por lo general, el componente de destino se conecta al origen de datos a través de un administrador de conexiones existente.

Para obtener información general sobre el componente de script, vea Ampliar el flujo de datos con el componente de script.

El componente de script y el código de infraestructura que genera simplifican considerablemente el proceso de desarrollo de un componente de flujo de datos personalizado. Sin embargo, para entender cómo funciona el componente de script, puede resultar útil leer los pasos que debe seguir para desarrollar componentes de flujo de datos personalizados en la sección Desarrollar un componente de flujo de datos personalizado y sobre todo en Desarrollar un componente de destino personalizado.

Introducción a un componente de destino

Al agregar un componente de script a la pestaña Flujo de datos del Diseñador SSIS, se abre el cuadro de diálogo Seleccionar el tipo de componente de script y se solicita la selección de un script de Origen, Destino o Transformación. En este cuadro de diálogo, seleccione Destino.

A continuación, conecte la salida de una transformación al componente de destino en el Diseñador SSIS. Como prueba, puede conectar un origen directamente a un destino sin ninguna transformación.

Configurar un componente de destino en modo de diseño de metadatos

Después de seleccionar la opción para crear un componente de destino, configure el componente mediante el Editor de transformación Script. Para obtener más información, vea Configurar el componente de script en el editor de componentes de script.

Para seleccionar el lenguaje de script que utilizará el destino de script, establezca la propiedad ScriptLanguage en la página Script del cuadro de diálogo Editor de transformación Script.

[!NOTA]

Para establecer el lenguaje de scripting predeterminado para el componente de script, utilice la opción Lenguaje de scripting en la página General del cuadro de diálogo Opciones. Para obtener más información, vea Página General.

Un componente de destino de flujo de datos tiene una entrada y ninguna salida. La configuración de la entrada del componente es uno de los pasos que debe completar en el modo de diseño de metadatos, mediante el Editor de transformación Script, antes de escribir un script personalizado.

Agregar administradores de conexión

Normalmente, un componente de destino utiliza un administrador de conexiones existente para conectarse al origen de datos donde guarda los datos del flujo de datos. En la página Administradores de conexión del Editor de transformación Script, haga clic en Agregar para agregar el administrador de conexiones adecuado.

Sin embargo, un administrador de conexiones es tan solo una unidad práctica que encapsula y almacena la información necesaria para conectarse a un origen de datos de un tipo determinado. Debe escribir su propio código personalizado para cargar o guardar los datos y posiblemente para abrir y cerrar la conexión al origen de datos.

Para obtener información general sobre cómo utilizar los administradores de conexión con el componente de script, vea Conectarse a orígenes de datos del componente de script.

Para obtener más información acerca de la página Administradores de conexión del Editor de transformación Script, vea Editor de transformación Script (página Administradores de conexión).

Configurar entradas y columnas de entrada

Un componente de destino tiene una entrada y ninguna salida.

En la página Columnas de entrada del Editor de transformación Script, la lista de columnas muestra las columnas disponibles de la salida del componente de nivel superior en el flujo de datos. Seleccione las columnas que desea guardar.

Para obtener más información acerca de la página Columnas de entrada del Editor de transformación Script, vea Editor de transformación Script (página Columnas de entrada).

La página Entradas y salidas del Editor de transformación Script muestra una entrada única, cuyo nombre puede cambiar. Hará referencia a la entrada por su nombre en el script mediante la propiedad de descriptor de acceso creada en el código generado automáticamente.

Para obtener más información acerca de la página Entradas y salidas del Editor de transformación Script, vea Editor de transformación Script (página Entradas y salidas).

Agregar variables

Si desea utilizar variables existentes en el script, puede agregarlas en los campos de propiedades ReadOnlyVariables y ReadWriteVariables de la página Script del Editor de transformación Script.

Cuando agregue varias variables a los campos de propiedades, separe sus nombres con comas. Para seleccionar varias variables, también puede hacer clic en el botón de puntos suspensivos () situado junto a los campos de propiedades ReadOnlyVariables y ReadWriteVariables y, a continuación, seleccionar las variables en el cuadro de diálogo Seleccionar variables.

Para obtener información general acerca de la forma de usar variables con el componente de script, vea Utilizar variables en el componente de script.

Para obtener más información acerca de la página Script del Editor de transformación Script, vea Editor de transformación Script (página Script).

Generar script en un componente de destino en modo de diseño de código

Después de haber configurado los metadatos para el componente, puede escribir un script personalizado. En la página Script del Editor de transformación Script, haga clic en Editar script para abrir el IDE de Microsoft Visual Studio Tools for Applications (VSTA), donde puede agregar el script personalizado. El lenguaje de scripting que utilice dependerá de si ha seleccionado Microsoft Visual Basic o Microsoft Visual C# como lenguaje de script para la propiedad ScriptLanguage en la página Script.

Para obtener información importante aplicable a todos los tipos de componentes creados mediante el componente de script, vea Codificar y depurar el componente de script.

Descripción del código generado automáticamente

Al abrir el IDE de VSTA después de crear y configurar un componente de destino, la clase ScriptMain modificable aparece en el editor de código con un código auxiliar para el método ProcessInputRow. En la clase ScriptMain se escribirá el código personalizado; ProcessInputRow es el método más importante de un componente de destino.

Si abre la ventana Explorador de proyectos de VSTA, puede ver que el componente de script también ha generado elementos de proyecto BufferWrapper y ComponentWrapper de solo lectura. La clase ScriptMain hereda de la clase UserComponent en el elemento de proyecto ComponentWrapper.

En tiempo de ejecución, el motor de flujo de datos invoca el método ProcessInput de la clase UserComponent, lo que invalida el método ProcessInput de la clase primaria ScriptComponent. A su vez, el método ProcessInput recorre las filas del búfer de entrada y llama al método ProcessInputRow una vez por cada fila.

Escribir código personalizado

Para terminar de crear un componente de destino personalizado, puede escribir script en los siguientes métodos disponibles en la clase ScriptMain.

  1. Invalide el método AcquireConnections para conectarse al origen de datos externo. Extraiga el objeto de conexión, o la información de conexión necesaria, del administrador de conexiones.

  2. Invalide el método PreExecute para preparar el almacenamiento de los datos. Por ejemplo, en este método puede crear y configurar una clase SqlCommand y sus parámetros.

  3. Utilice el método ProcessInputRow invalidado para copiar cada fila de entrada en el origen de datos externo. Por ejemplo, para un destino SQL Server, puede copiar los valores de columna en los parámetros de SqlCommand y ejecutar el comando una vez para cada fila. Para un destino de archivo plano, puede escribir los valores de cada columna en StreamWriter, separándolos mediante el delimitador de columna.

  4. Invalide el método PostExecute para desconectarse del origen de datos externo, si se requiere, y para realizar cualquier otra limpieza necesaria.

Ejemplos

Los ejemplos siguientes muestran código que se requiere en la clase ScriptMain para crear un componente de destino.

[!NOTA]

Estos ejemplos usan la tabla Person.Address de la base de datos de ejemplo AdventureWorks y pasan la primera y la cuarta columna, las columnas int AddressID y nvarchar(30) City, a través del flujo de datos. Estos mismos datos se usan en los ejemplos de origen, transformación y destino de esta sección. Se documentan requisitos previos y suposiciones adicionales para cada ejemplo.

Ejemplo de destino ADO.NET

En este ejemplo se muestra un componente de destino que utiliza un administrador de conexiones de ADO.NET existente para guardar datos del flujo de datos en una tabla de SQL Server.

Si desea ejecutar este código de ejemplo, debe configurar el paquete y el componente de la siguiente forma:

  1. Cree un administrador de conexiones de ADO.NET que utilice el proveedor SqlClient para conectarse a la base de datos AdventureWorks.

  2. Cree una tabla de destino ejecutando el siguiente comando Transact-SQL en la base de datos AdventureWorks:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  3. Agregue un nuevo componente de script a la superficie del diseñador de flujo de datos y configúrelo como destino.

  4. Conecte la salida de un origen o transformación de nivel superior al componente de destino en el Diseñador SSIS. (Puede conectar directamente un origen a un destino sin ninguna transformación.) Esta salida debe proporcionar datos de la tabla Person.Address de la base de datos de ejemplo AdventureWorks que contiene al menos las columnas AddressID y City.

  5. Abra el Editor de transformación Script. En la página Columnas de entrada, seleccione las columnas de entrada AddressID y City.

  6. En la página Entradas y salidas, cambie el nombre de la entrada por un nombre más descriptivo como MyAddressInput.

  7. En la página Administradores de conexión, agregue o cree el administrador de conexiones de ADO.NET con un nombre descriptivo como MyADONETConnectionManager.

  8. En la página Script, haga clic en Editar script y escriba el script que se indica a continuación. A continuación, cierre el entorno de desarrollo de script.

  9. Cierre el Editor de transformación Script y ejecute el ejemplo.

Imports System.Data.SqlClient
...
Public Class ScriptMain
    Inherits UserComponent

    Dim connMgr As IDTSConnectionManager100
    Dim sqlConn As SqlConnection
    Dim sqlCmd As SqlCommand
    Dim sqlParam As SqlParameter

    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)

        connMgr = Me.Connections.MyADONETConnectionManager
        sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)

    End Sub

    Public Overrides Sub PreExecute()

        sqlCmd = New SqlCommand("INSERT INTO Person.Address2(AddressID, City) " & _
            "VALUES(@addressid, @city)", sqlConn)
        sqlParam = New SqlParameter("@addressid", SqlDbType.Int)
        sqlCmd.Parameters.Add(sqlParam)
        sqlParam = New SqlParameter("@city", SqlDbType.NVarChar, 30)
        sqlCmd.Parameters.Add(sqlParam)

    End Sub

    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
        With sqlCmd
            .Parameters("@addressid").Value = Row.AddressID
            .Parameters("@city").Value = Row.City
            .ExecuteNonQuery()
        End With
    End Sub

    Public Overrides Sub ReleaseConnections()

        connMgr.ReleaseConnection(sqlConn)

    End Sub

End Class
using System.Data.SqlClient;
public class ScriptMain:
    UserComponent

{
    IDTSConnectionManager100 connMgr;
    SqlConnection sqlConn;
    SqlCommand sqlCmd;
    SqlParameter sqlParam;

    public override void AcquireConnections(object Transaction)
    {

        connMgr = this.Connections.MyADONETConnectionManager;
        sqlConn = (SqlConnection)connMgr.AcquireConnection(null);

    }

    public override void PreExecute()
    {

        sqlCmd = new SqlCommand("INSERT INTO Person.Address2(AddressID, City) " +
            "VALUES(@addressid, @city)", sqlConn);
        sqlParam = new SqlParameter("@addressid", SqlDbType.Int);
        sqlCmd.Parameters.Add(sqlParam);
        sqlParam = new SqlParameter("@city", SqlDbType.NVarChar, 30);
        sqlCmd.Parameters.Add(sqlParam);

    }

    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
    {
        {
            sqlCmd.Parameters["@addressid"].Value = Row.AddressID;
            sqlCmd.Parameters["@city"].Value = Row.City;
            sqlCmd.ExecuteNonQuery();
        }
    }

    public override void ReleaseConnections()
    {

        connMgr.ReleaseConnection(sqlConn);

    }

}

Ejemplo de destino de archivo plano

En este ejemplo se muestra un componente de destino que utiliza un administrador de conexiones de archivos planos existente para guardar datos del flujo de datos en un archivo plano.

Si desea ejecutar este código de ejemplo, debe configurar el paquete y el componente de la siguiente forma:

  1. Cree un administrador de conexiones de archivos planos que conecte a un archivo de destino. El archivo no tiene que existir; el componente de destino lo creará. Configure el archivo de destino como un archivo delimitado por comas que contenga las columnas AddressID y City.

  2. Agregue un nuevo componente de script a la superficie del diseñador de flujo de datos y configúrelo como destino.

  3. Conecte la salida de un origen o transformación de nivel superior al componente de destino en el Diseñador SSIS. (Puede conectar directamente un origen a un destino sin ninguna transformación.) Esta salida debe proporcionar datos de la tabla Person.Address de la base de datos de ejemplo AdventureWorks y debe contener al menos las columnas AddressID y City.

  4. Abra el Editor de transformación Script. En la página Columnas de entrada, seleccione las columnas AddressID y City.

  5. En la página Entradas y salidas, cambie el nombre de la entrada por un nombre más descriptivo, como MyAddressInput.

  6. En la página Administradores de conexión, agregue o cree el administrador de conexiones de archivos planos con un nombre descriptivo como MyFlatFileDestConnectionManager.

  7. En la página Script, haga clic en Editar script y escriba el script que se indica a continuación. A continuación, cierre el entorno de desarrollo de script.

  8. Cierre el Editor de transformación Script y ejecute el ejemplo.

Imports System.IO
...
Public Class ScriptMain
    Inherits UserComponent

    Dim copiedAddressFile As String
    Private textWriter As StreamWriter
    Private columnDelimiter As String = ","

    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)

        Dim connMgr As IDTSConnectionManager100 = _
            Me.Connections.MyFlatFileDestConnectionManager
        copiedAddressFile = CType(connMgr.AcquireConnection(Nothing), String)

    End Sub

    Public Overrides Sub PreExecute()

        textWriter = New StreamWriter(copiedAddressFile, False)

    End Sub

    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)

        With textWriter
            If Not Row.AddressID_IsNull Then
                .Write(Row.AddressID)
            End If
            .Write(columnDelimiter)
            If Not Row.City_IsNull Then
                .Write(Row.City)
            End If
            .WriteLine()
        End With

    End Sub

    Public Overrides Sub PostExecute()

        textWriter.Close()

    End Sub

End Class
using System.IO;
public class ScriptMain:
    UserComponent

{
    string copiedAddressFile;
    private StreamWriter textWriter;
    private string columnDelimiter = ",";

    public override void AcquireConnections(object Transaction)
    {

        IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileDestConnectionManager;
        copiedAddressFile = (string) connMgr.AcquireConnection(null);

    }

    public override void PreExecute()
    {

        textWriter = new StreamWriter(copiedAddressFile, false);

    }

    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
    {

        {
            if (!Row.AddressID_IsNull)
            {
                textWriter.Write(Row.AddressID);
            }
            textWriter.Write(columnDelimiter);
            if (!Row.City_IsNull)
            {
                textWriter.Write(Row.City);
            }
            textWriter.WriteLine();
        }

    }

    public override void PostExecute()
    {

        textWriter.Close();

    }

}
Icono de Integration Services (pequeño) Manténgase al día con Integration Services

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


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

Vea también

Conceptos

Crear un origen con el componente de script

Desarrollar un componente de destino personalizado