Noções básicas sobre o modelo de objeto do componente script

Aplica-se a: SQL Server SSIS Integration Runtime em Azure Data Factory

Como discutido em Codificação e Depuração do Componente Script, o projeto do componente Script contém três itens do projeto:

  1. O item ScriptMain , que contém a classe ScriptMain na qual escreve o seu código. A classe ScriptMain herda da classe UserComponent .

  2. O item ComponentWrapper , que contém a classe UserComponent , uma instância de ScriptComponent que contém os métodos e propriedades que irá usar para processar dados e interagir com o pacote. O item ComponentWrapper também contém classes de coleção Connections and Variables .

  3. O item BufferWrapper , que contém classes que herdam de ScriptBuffer para cada entrada e saída, e propriedades tipadas para cada coluna.

Ao escrever o seu código no item ScriptMain , irá utilizar os objetos, métodos e propriedades discutidos neste tópico. Cada componente não utilizará todos os métodos aqui listados; no entanto, quando usados, são usados na sequência mostrada.

A ScriptComponent classe base não contém qualquer código de implementação para os métodos discutidos neste tópico. Portanto, é desnecessário, mas inofensivo, adicionar uma chamada à implementação da classe base à sua própria implementação do método.

Para informações sobre como usar os métodos e propriedades destas classes num determinado tipo de componente Script, consulte a secção Exemplos Adicionais de Componentes Script. Os tópicos de exemplo também contêm exemplos completos de código.

Método AcquireConnections

As fontes e destinos geralmente têm de se ligar a uma fonte de dados externa. Substitua o AcquireConnections método da ScriptComponent classe base para recuperar a ligação ou a informação de ligação do gestor de ligação apropriado.

O exemplo seguinte devolve um System.Data.SqlClient.SqlConnection de um gestor de conexões ADO.NET.

Dim connMgr As IDTSConnectionManager100  
Dim sqlConn As SqlConnection  
  
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)  
  
    connMgr = Me.Connections.MyADONETConnection  
    sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)  
  
End Sub  

O exemplo seguinte devolve um caminho completo e o nome do ficheiro a partir de um Flat File Gestor de Ligações, e depois abre o ficheiro usando um System.IO.StreamReader.

Private textReader As StreamReader  
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)  
  
    Dim connMgr As IDTSConnectionManager100 = _  
        Me.Connections.MyFlatFileSrcConnectionManager  
    Dim exportedAddressFile As String = _  
        CType(connMgr.AcquireConnection(Nothing), String)  
    textReader = New StreamReader(exportedAddressFile)  
  
End Sub  

Método de Pré-Execução

Substitua o PreExecute método da ScriptComponent classe base sempre que tiver processamento que deve realizar apenas uma vez antes de começar a processar linhas de dados. Por exemplo, num destino, pode querer configurar o comando parametrizado que o destino usará para inserir cada linha de dados na fonte de dados.

    Dim sqlConn As SqlConnection  
    Dim sqlCmd As SqlCommand  
    Dim sqlParam As SqlParameter  
...  
    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  
SqlConnection sqlConn;   
SqlCommand sqlCmd;   
SqlParameter sqlParam;   
  
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);   
  
}  

Processamento de Entradas e Saídas

Processamento de Entradas

Componentes de script configurados como transformações ou destinos têm uma entrada.

O que o item do Project BufferWrapper oferece

Para cada entrada que configuraste, o item do projeto BufferWrapper contém uma classe que deriva de ScriptBuffer e tem o mesmo nome da entrada. Cada classe de buffer de entrada contém as seguintes propriedades, funções e métodos:

  • Propriedades do acessório nomeadas e digitadas para cada coluna de entrada selecionada. Estas propriedades são apenas leitura ou leitura/escrita, dependendo do Tipo de Utilização especificado para a coluna na página de Colunas de Entrada do Editor de Transformação de Scripts.

  • Uma <propriedade _IsNull coluna> para cada coluna de entrada selecionada. Esta propriedade é também apenas leitura ou leitura/escrita, dependendo do Tipo de Uso especificado para a coluna.

  • Um método de outputbuffer> DirectRowTo< para cada saída configurada. Vais usar estes métodos ao filtrar linhas para uma das várias saídas no mesmo ExclusionGroup.

  • Uma função NextRow para obter a próxima linha de entrada, e uma função EndOfRowset para determinar se o último buffer de dados foi processado. Normalmente não precisa destas funções quando utiliza os métodos de processamento de entrada implementados na classe base UserComponent . A secção seguinte fornece mais informações sobre a classe base UserComponent .

O que o item do Project ComponentWrapper oferece

O item do projeto ComponentWrapper contém uma classe chamada UserComponent que deriva de ScriptComponent. A classe ScriptMain na qual escreve o seu código personalizado deriva, por sua vez, do UserComponent. A classe UserComponent contém os seguintes métodos:

  • Uma implementação sobreposta do método ProcessInput . Este é o método que o motor de fluxo de dados chama a seguir em tempo de execução após o método PreExecut , podendo ser chamado várias vezes. O ProcessInput entrega o processamento para o <método _ProcessInput> inputbuffer . Depois, o método ProcessInput verifica o fim do buffer de entrada e, se o fim do buffer for atingido, chama o método FinishOutputs overridable e o método privado MarkOutputsAsFinished . O método MarkOutputsAsFinished chama então o SetEndOfRowset no último buffer de saída.

  • Uma implementação sobrescrita do <método inputbuffer>_ProcessInput . Esta implementação por defeito simplesmente percorre cada linha de entrada e chama <inputbuffer>_ProcessInputRow.

  • Uma implementação sobrescrita do <>método inputbuffer_ProcessInputRow. A implementação padrão está vazia. Este é o método que normalmente irá sobrepor para escrever o seu código personalizado de processamento de dados.

O que o seu código personalizado deve fazer

Pode usar os seguintes métodos para processar a entrada na classe ScriptMain :

  • Override< inputbuffer>_ProcessInputRow para processar os dados em cada linha de entrada à medida que passam.

  • Override< o inputbuffer>_ProcessInput só se tiveres de fazer algo adicional enquanto percorres as linhas de entrada. (Por exemplo, tens de testar se o EndOfRowSet realiza outra ação depois de todas as linhas terem sido processadas.) Chame <o inputbuffer>_ProcessInputRow para realizar o processamento da linha.

  • Anule o FinishOutputs se tiver de fazer algo nas saídas antes de serem fechadas.

O método ProcessInput garante que estes métodos são chamados nos momentos apropriados.

Resultados de Processamento

Os componentes de script configurados como fontes ou transformações têm uma ou mais saídas.

O que o item do Project BufferWrapper oferece

Para cada saída configurada, o item do projeto BufferWrapper contém uma classe que deriva de ScriptBuffer e tem o mesmo nome da saída. Cada classe de buffer de entrada contém as seguintes propriedades e métodos:

  • Propriedades de acesso nomeadas, digitadas e apenas de escrita para cada coluna de saída.

  • Uma propriedade de apenas<> escrita_IsNull para cada coluna de saída selecionada que podes usar para definir o valor da coluna como nulo.

  • Um método AddRow para adicionar uma nova linha vazia ao buffer de saída.

  • Um método SetEndOfRowset para informar o motor de fluxo de dados que não se esperam mais buffers de dados. Existe também uma função EndOfRowset para determinar se o buffer atual é o último buffer de dados. Geralmente, não precisa destas funções quando utiliza os métodos de processamento de entrada implementados na classe base UserComponent .

O que o item do Project ComponentWrapper oferece

O item do projeto ComponentWrapper contém uma classe chamada UserComponent que deriva de ScriptComponent. A classe ScriptMain na qual escreve o seu código personalizado deriva, por sua vez, do UserComponent. A classe UserComponent contém os seguintes métodos:

  • Uma implementação sobreposta do método PrimeOutput . O motor de fluxo de dados chama este método antes do ProcessInput em tempo de execução, e só é chamado uma vez. O PrimeOutput entrega o processamento para o método CreateNewOutputRows . Depois, se o componente for uma fonte (ou seja, o componente não tiver entradas), o PrimeOutput chama o método FinishOutputs sobrescrito e o método privado MarkOutputsAsFinished . O método MarkOutputsAsFinished chama SetEndOfRowset no último buffer de saída.

  • Uma implementação sobrescrita do método CreateNewOutputRows . A implementação padrão está vazia. Este é o método que normalmente irá sobrepor para escrever o seu código personalizado de processamento de dados.

O que o seu código personalizado deve fazer

Pode usar os seguintes métodos para processar as saídas na classe ScriptMain :

  • Substitua o CreateNewOutputRows apenas quando puder adicionar e preencher linhas de saída antes de processar as linhas de entrada. Por exemplo, pode usar o CreateNewOutputRows numa fonte, mas numa transformação com saídas assíncronas, deve chamar o AddRow durante ou após o processamento dos dados de entrada.

  • Anule o FinishOutputs se tiver de fazer algo nas saídas antes de serem fechadas.

O método PrimeOutput garante que estes métodos são chamados nos momentos apropriados.

Método PostExecute

Substitua o PostExecute método da ScriptComponent classe base sempre que tiver processamento que deve realizar apenas uma vez depois de ter processado as linhas de dados. Por exemplo, numa fonte, pode querer fechar o System.Data.SqlClient.SqlDataReader que utilizou para carregar dados no fluxo de dados.

Importante

A coleção de ReadWriteVariables está disponível apenas no método PostExecut . Portanto, não pode incrementar diretamente o valor de uma variável de pacote à medida que processa cada linha de dados. Em vez disso, incremente o valor de uma variável local e defina o valor da variável package para o valor da variável local no método PostExecute depois de todos os dados terem sido processados.

Método ReleaseConnections

As fontes e destinos normalmente têm de se ligar a uma fonte de dados externa. Substitua o ReleaseConnections método da ScriptComponent classe base para fechar e libertar a ligação que abriu anteriormente no AcquireConnections método.

    Dim connMgr As IDTSConnectionManager100  
...  
    Public Overrides Sub ReleaseConnections()  
  
        connMgr.ReleaseConnection(sqlConn)  
  
    End Sub  
IDTSConnectionManager100 connMgr;  
  
public override void ReleaseConnections()  
{  
  
    connMgr.ReleaseConnection(sqlConn);  
  
}