Partilhar via


Criando um destino com o componente Script

Você utiliza um componente de destino no fluxo de dados de um pacote do Integration Services para salvar dados recebidos de fontes upstream e transformações em uma fonte de dados. Em geral, o componente de destino se conecta à fonte de dados através de um gerenciador de conexões existente.

Para obter uma visão geral do componente Script, consulte Estendendo o fluxo de dados com o componente Script.

O componente Script e o código de infraestrutura gerado para você simplificam significativamente o processo de desenvolvimento de um componente de fluxo de dados personalizado. Contudo, para compreender o funcionamento do componente Script, talvez seja útil ler as etapas do desenvolvimento de componentes de fluxo de dados personalizados na seção Desenvolvendo um componente de fluxo de dados personalizado e, em especial, Desenvolvendo um componente de destino personalizado.

Guia de Introdução com um componente Destino

Quando você adiciona um componente Script à guia Fluxo de Dados do Designer SSIS, a caixa de diálogo Selecionar Tipo de Componente do Script é aberta e solicita que você selecione um script Origem, Destino ou Transformação. Nessa caixa de diálogo, selecione Destino.

Depois, conecte a saída de uma transformação ao componente de destino no Designer SSIS. Como teste, você pode conectar uma origem diretamente a um destino, sem qualquer transformação.

Configurando um componente Destino no modo do design de metadados

Depois de selecionar a opção para criar um componente de destino, configure o componente usando o Editor de Transformação Scripts. Para obter mais informações, consulte Configurando o componente Script no Editor de Componentes de Script.

Para selecionar a linguagem de script que o destino Script utilizará, defina a propriedade ScriptLanguage na página Script da caixa de diálogo Editor de Transformação Scripts.

ObservaçãoObservação

Para definir a linguagem de scripts padrão para o componente Script, use a opção Linguagem de scripts na página Geral da caixa de diálogo Opções. Para obter mais informações, consulte Página Geral.

Um componente de destino de fluxo de dados tem uma entrada e nenhuma saída. A configuração de entrada do componente é uma das etapas que você deve concluir no modo do design de metadados, através do Editor de Transformação Scripts, antes de escrever seu script personalizado.

Adicionando gerenciadores de conexões

Em geral, um componente de destino usa um gerenciador de conexões existente para se conectar à fonte de dados na qual ele salva dados do fluxo de dados. Na página Gerenciadores de Conexões do Editor de Transformação Scripts, clique em Adicionar para adicionar o gerenciador de conexões apropriado.

Contudo, um gerenciador de conexões é apenas uma unidade conveniente que encapsula e armazena as informações necessárias para a conexão a uma fonte de dados de um tipo específico. Escreva seu próprio código personalizado para carregar ou salvar seus dados e, possivelmente, para abrir e fechar a conexão à fonte de dados.

Para obter informações gerais sobre como usar gerenciadores de conexões com o componente Script, consulte Conectando-se a fontes de dados no componente de Script.

Para obter mais informações sobre a página Gerenciadores de Conexões do Editor de Transformação Scripts, consulte Editor de Transformação Scripts (página Gerenciadores de Conexões).

Configurando entradas e colunas de entrada

Um componente de destino tem uma entrada e nenhuma saída.

Na página Colunas de Entrada do Editor de Transformação Scripts, a lista de colunas mostra as colunas disponíveis da saída do componente upstream no fluxo de dados. Selecione as colunas a serem salvas.

Para obter mais informações sobre a página Colunas de Entrada do Editor de Transformação Scripts, consulte Editor de Transformação Scripts (página Colunas de Entrada).

A página Entradas e Saídas do Editor de Transformação Scripts mostra uma única entrada que pode ser renomeada. Você fará referência à entrada pelo nome em seu script usando a propriedade de acessador criada no código gerado automaticamente.

Para obter mais informações sobre a página Entradas e Saídas do Editor de Transformação Scripts, consulte Editor de Transformação Scripts (página Entradas e Saídas).

Adicionando variáveis

Se você quiser usar variáveis existentes em seu script, poderá adicioná-las nos campos de propriedade ReadOnlyVariables e ReadWriteVariables na página Script do Editor de Transformação Scripts.

Ao adicionar diversas variáveis aos campos de propriedade, separe os nomes das variáveis com vírgulas. Outra alternativa para selecionar diversas variáveis é clicar no botão de reticências () que fica ao lado dos campos de propriedade ReadOnlyVariables e ReadWriteVariables e depois selecione as variáveis na caixa de diálogo Selecionar variáveis.

Para obter informações gerais sobre como usar variáveis com o componente Script, consulte Usando variáveis no componente Script.

Para obter mais informações sobre a página Script do Editor de Transformação Scripts, consulte Editor de Transformação Scripts (página Script).

Gerando scripts de um componente de destino em modo do design de código

Depois de configurar os metadados do seu componente, você poderá escrever seu script personalizado. No Editor de Transformação Scripts, na página Script, clique em Editar Script para abrir o Microsoft Visual Studio Tools for Applications (VSTA) IDE, onde você pode adicionar o script personalizado. Para saber a linguagem de scripts a ser usada, primeiro verifique se você selecionou a linguagem de script Microsoft Visual Basic 2008 ou Microsoft Visual C# 2008 para a propriedade ScriptLanguage na página Script.

Para obter informações importantes que se aplicam a todos os tipos de componentes criados através do componente Script, consulte Codificando e depurando o componente Script.

Compreendendo o código gerado automaticamente

Quando você abre o VSTA IDE depois de criar e configurar um componente de destino, a classe ScriptMain editável aparece no editor de códigos com um stub para o método ProcessInputRow. A classe ScriptMain é onde você escreverá seu código personalizado, e ProcessInputRow é o método mais importante em um componente de destino.

Se você abrir a janela Explorador de Projeto do VSTA, verificará que o componente Script também gerou BufferWrapper somente leitura e itens de projeto ComponentWrapper. A classe ScriptMain herda da classe UserComponent no item de projeto ComponentWrapper.

Em tempo de execução, o mecanismo de fluxo de dados invoca o método ProcessInput na classe UserComponent, que substitui o método ProcessInput da classe pai ScriptComponent. O método ProcessInput, por sua vez, executa um loop nas linhas do buffer de entrada e chama o método ProcessInputRow uma vez para cada linha.

Escrevendo seu código personalizado

Para terminar de criar um componente de destino personalizado, você pode escrever um script nos métodos a seguir disponíveis na classe ScriptMain.

  1. Substitua o método AcquireConnections para se conectar à fonte de dados externa. Extraia o objeto de conexão, ou as informações de conexão requeridas, do gerenciador de conexões.

  2. Substitua o método PreExecute como preparo para salvar os dados. Por exemplo, talvez você queira criar e configurar um SqlCommand e seus parâmetros nesse método.

  3. Use o método ProcessInputRow substituído para copiar cada linha de entrada para a fonte de dados externa. Por exemplo, para um destino SQL Server, você pode copiar os valores de coluna nos parâmetros de um SqlCommand e executar o comando uma vez para cada linha. Para um destino de arquivo simples, você pode escrever os valores de cada coluna para um StreamWriter, separando-os com o delimitador de colunas.

  4. Substitua o método PostExecute para desconectar-se da fonte de dados externa, caso necessário, e executar qualquer outra limpeza requerida.

Exemplos

Os exemplos a seguir demonstram o código que é requerido na classe ScriptMain para criar um componente de destino.

ObservaçãoObservação

Estes exemplos usam a tabela Person.Address no banco de dados de exemplo AdventureWorks2008R2 e passam a primeira e a quarta colunas, as colunas int AddressID e nvarchar(30) City, por meio do fluxo de dados. Os mesmos dados são usados nos exemplos de origem, transformação e destino nessa seção. Pré-requisitos e suposições adicionais são documentados para cada exemplo.

Exemplo de destino ADO.NET

Esse exemplo demonstra um componente de destino que usa um gerenciador de conexões ADO.NET existente para salvar dados do fluxo de dados em uma tabela SQL Server.

Se você quiser executar esse código de exemplo, configure o pacote e o componente desta forma:

  1. Crie um gerenciador de conexões ADO.NET que usa o provedor SqlClient para se conectar ao banco de dados AdventureWorks2008R2.

  2. Crie uma tabela de destino executando o seguinte comando Transact-SQL no banco de dados AdventureWorks2008R2:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  3. Adicione um novo componente Script à superfície do designer Fluxo de Dados e configure-o como um destino.

  4. Conecte a saída de uma origem ou transformação upstream para o componente de destino no Designer SSIS. (Você pode conectar uma origem diretamente a um destino, sem transformações.) Essa saída deve fornecer dados da tabela Person.Address do banco de dados de exemplo do AdventureWorks2008R2 que contém pelo menos as colunas AddressID e City.

  5. Abra o Editor de Transformação Scripts. Na página Colunas de Entrada, selecione as colunas AddressID e City.

  6. Na página Entradas e Saídas, renomeie a entrada com um nome mais descritivo, como MyAddressInput.

  7. Na página Gerenciadores de Conexões, adicione ou crie o gerenciador de conexões ADO.NET com um nome como MyADONETConnectionManager.

  8. Na página Script, clique em Editar Script e digite o script a seguir. Depois, feche o ambiente de desenvolvimento de script.

  9. Feche o Editor de Transformação Scripts e execute o exemplo.

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);

    }

}

Exemplo de Destino de Arquivos Simples

Esse exemplo demonstra um componente de destino que usa um gerenciador de conexões de arquivos simples existente para salvar dados do fluxo de dados em um arquivo simples.

Se você quiser executar esse código de exemplo, configure o pacote e o componente desta forma:

  1. Crie um gerenciador de conexões de arquivos simples que se conecte a um arquivo de destino. Não é necessário que o arquivo já exista; o componente de destino irá criá-lo. Configure o arquivo de destino como um arquivo delimitado por vírgulas que contém as colunas AddressID e City.

  2. Adicione um novo componente Script à superfície do designer Fluxo de Dados e configure-o como um destino.

  3. Conecte a saída de uma origem ou transformação upstream para o componente de destino no Designer SSIS. (Você pode conectar uma origem diretamente a um destino, sem transformações.) A saída deve fornecer dados da tabela Person.Address do banco de dados de exemplo AdventureWorks2008R2 e deve conter pelo menos as colunas AddressID e City.

  4. Abra o Editor de Transformação Scripts. Na página Colunas de Entrada, selecione as colunas AddressID e City.

  5. Na página Entradas e Saídas, renomeie a entrada com um nome mais descritivo, como MyAddressInput.

  6. Na página Gerenciadores de Conexões, adicione ou crie o gerenciador de conexões de arquivos simples com um nome descritivo como MyFlatFileDestConnectionManager.

  7. Na página Script, clique em Editar Script e digite o script a seguir. Depois, feche o ambiente de desenvolvimento de script.

  8. Feche o Editor de Transformação Scripts e execute o exemplo.

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();

    }

}
Ícone do Integration Services (pequeno) Fique atualizado com o Integration Services

Para obter os mais recentes downloads, artigos, exemplos e vídeos da Microsoft, bem como soluções exclusivas da comunidade, visite a página do Integration Services no MSDN ou TechNet:

Para receber uma notificação automática das atualizações, assine os feeds RSS disponíveis na página.