Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Conforme discutido em [Codificando e depurando o componente de script](.. /extending-packages-scripting/data-flow-script-component/coding-and-debugging-the-script-component.md, o projeto do componente Script contém três itens de projeto:
O item
ScriptMain, que contém a classeScriptMainna qual você escreve seu código. A classeScriptMainherda da classeUserComponent.O item
ComponentWrapper, que contém a classeUserComponent, uma instância do ScriptComponent que contém os métodos e propriedades que você utilizará para processar dados e interagir com o pacote. O itemComponentWrappertambém contém as classes de coleçãoConnectionseVariables.O item
BufferWrapper, que contém classes herdadas de ScriptBuffer para cada entrada e saída, e propriedades digitadas para cada coluna.
À medida que você escrever seu código no item ScriptMain, usará os objetos, métodos e propriedades discutidos nesse tópico. Cada componente não usará todos os métodos listados aqui; porém, quando usados, eles obedecerão à sequência mostrada.
A classe base ScriptComponent não contém códigos de implementação para os métodos discutidos nesse tópico. Portanto, é desnecessário, mas inofensivo, adicionar uma chamada à implementação de classe base na sua própria implementação do método.
Para obter informações sobre como usar os métodos e propriedades dessas classes em um tipo específico de componente Script, consulte a seção Exemplos adicionais de componente de script. Os tópicos de exemplo também contêm exemplos de código completos.
Método AcquireConnections
Origens e destinos geralmente precisam se conectar a uma fonte de dados externa. Substitua o método AcquireConnections da classe base ScriptComponent para recuperar a conexão ou as informações de conexão do gerenciador de conexões apropriado.
O exemplo a seguir retorna um System.Data.SqlClient.SqlConnection de um gerenciador 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 a seguir retorna um caminho completo e o nome de arquivo de um Gerenciador de Conexões de Arquivos Simples e, em seguida, abre o arquivo por meio de 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 PreExecute
Substitua o método PreExecute da classe base ScriptComponent sempre que existir um processamento que precisa ser executado apenas uma vez antes de iniciar o processamento de linhas de dados. Por exemplo, em um destino, talvez você queira configurar o comando com parâmetros que o destino utilizará 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);
}
Processando entradas e saídas
Processando entradas
Componentes Script que são configurados como transformações ou destinos têm uma entrada.
O que o item de projeto BufferWrapper fornece
Para cada entrada configurada, o item de projeto BufferWrapper contém uma classe que deriva de ScriptBuffer e tem o mesmo nome que a entrada. Cada classe de buffer de entrada contém as seguintes propriedades, funções e métodos:
Propriedades de acessador nomeadas, digitadas para cada coluna de entrada selecionada. Essas propriedades são somente leitura ou de leitura/gravação, dependendo do Tipo de Uso especificado para a coluna na página Colunas de Entrada do Editor de Transformação Scripts.
Uma propriedade <column>_IsNull para cada coluna de entrada selecionada. Essa propriedade também é somente leitura ou de leitura/gravação, dependendo do Tipo de Uso especificado para a coluna.
Um método DirectRowTo<outputbuffer> para cada saída configurada. Você usará esses métodos ao filtrar linhas para uma das várias saídas no mesmo
ExclusionGroup.Uma função
NextRowpara obter a próxima linha de entrada e uma funçãoEndOfRowsetpara determinar se o último buffer de dados foi processado. Em geral, você não precisa dessas funções ao usar os métodos de processamento de entrada implementados na classe baseUserComponent. A próxima seção fornece mais informações sobre a classe baseUserComponent.
O que o item de projeto ComponentWrapper fornece
O item de projeto ComponentWrapper contém uma classe nomeada UserComponent que deriva de ScriptComponent. A classe ScriptMain na qual você escreve seu código personalizado, por sua vez, deriva de UserComponent. A classe UserComponent contém os seguintes métodos:
Uma implementação substituída do método
ProcessInput. Esse é o método que o mecanismo de fluxo de dados chama em seguida no tempo de execução, depois do métodoPreExecute, e ele pode ser chamado várias vezes.ProcessInputDesative o processamento para o <método inputbuffer>_ProcessInput . Depois, o métodoProcessInputverifica se o buffer de entrada chegou ao final e, em caso positivo, chama o método substituívelFinishOutputse o método particularMarkOutputsAsFinished. Em seguida, oMarkOutputsAsFinishedmétodo chamaSetEndOfRowseto último buffer de saída.Uma implementação substituível do método <inputbuffer>_ProcessInput. Essa implementação padrão simplesmente executa um loop em cada linha de entrada e chama <inputbuffer>_ProcessInputRow.
Uma implementação substituível do método <inputbuffer>_ProcessInputRow. A implementação padrão é vazia. Esse é o método que, em geral, você substituirá para escrever seu código de processamento de dados personalizado.
O que seu código personalizado deve fazer
Você pode usar os seguintes métodos para processar a entrada na classe ScriptMain:
Substitua o <inputbuffer>_ProcessInputRow para processar os dados em cada linha de entrada conforme ela passa.
Só substitua o <inputbuffer>_ProcessInput se você precisar fazer algo adicional enquanto executa um loop em linhas de entrada. (Por exemplo, você precisa testar para
EndOfRowsetexecutar alguma outra ação depois que todas as linhas tiverem sido processadas.) Chame <inputbuffer>_ProcessInputRow para executar o processamento de linha.Substitua o
FinishOutputsse precisar fazer algo nas saídas antes de seu fechamento.
O método ProcessInput garante que esses métodos sejam chamados nos momentos apropriados.
Processando saídas
Componentes Script configurados como origens ou transformações têm uma ou mais saídas.
O que o item de projeto BufferWrapper fornece
Para cada saída configurada, o item de projeto BufferWrapper contém uma classe que deriva de ScriptBuffer e possui o mesmo nome que a saída. Cada classe de buffer de entrada contém as seguintes propriedades e métodos:
Propriedades do acessador nomeado, digitado, somente gravação para cada coluna de saída.
Uma propriedade< column_IsNull>gravação para cada coluna de saída selecionada que você pode usar para definir o valor da coluna como
null.Um método
AddRowpara adicionar uma linha nova vazia ao buffer de saída.Um método
SetEndOfRowsetpara notificar o mecanismo de fluxo de dados buffers de que dados não são mais esperados. Também há uma funçãoEndOfRowsetpara determinar se o buffer atual é o último buffer de dados. Geralmente, você não precisa dessas funções ao usar os métodos de processamento de entrada implementados naUserComponentclasse base.
O que o item de projeto ComponentWrapper fornece
O item de projeto ComponentWrapper contém uma classe nomeada UserComponent que deriva de ScriptComponent. A classe ScriptMain na qual você escreve seu código personalizado, por sua vez, deriva de UserComponent. A classe UserComponent contém os seguintes métodos:
Uma implementação substituída do método
PrimeOutput. O mecanismo de fluxo de dados chama esse método antes doProcessInputem tempo de execução e ele é chamado apenas uma vez.PrimeOutputentrega o processamento para o métodoCreateNewOutputRows. Depois, se o componente for uma origem (ou seja, se o componente não possuir entradas), oPrimeOutputchamará o métodoFinishOutputssubstituível e o métodoMarkOutputsAsFinishedparticular. O métodoMarkOutputsAsFinishedchama oSetEndOfRowsetno último buffer de saída.Uma implementação substituível do método
CreateNewOutputRows. A implementação padrão é vazia. Esse é o método que, em geral, você substituirá para escrever seu código de processamento de dados personalizado.
O que seu código personalizado deve fazer
Você pode usar os seguintes métodos para processar saídas na classe ScriptMain:
Substitua
CreateNewOutputRowsapenas quando você puder adicionar e preencher linhas de saída antes de processar linhas de entrada. Por exemplo, você pode usar oCreateNewOutputRowsem uma origem. Mas em uma transformação com saídas assíncronas, chame oAddRowdurante ou depois do processamento de dados de entrada.Substitua o
FinishOutputsse precisar fazer algo nas saídas antes de seu fechamento.
O método PrimeOutput garante que esses métodos sejam chamados nos momentos apropriados.
Método PostExecute
Substitua o método PostExecute da classe base ScriptComponent sempre que houver processamento a ser executado uma só vez após o processamento das linhas de dados. Por exemplo, em uma origem, talvez você queira fechar o System.Data.SqlClient.SqlDataReader usado para carregar dados no fluxo de dados.
Importante
A coleção de ReadWriteVariables só está disponível no método PostExecute. Portanto, não será possível incrementar diretamente o valor de uma variável de pacote ao processar cada linha de dados. Em vez disso, incremente o valor de uma variável local e defina o valor da variável de pacote como o valor da variável local no PostExecute método depois que todos os dados tiverem sido processados.
Método ReleaseConnections
Origens e destinos geralmente precisam se conectar a uma fonte de dados externa. Substitua o método ReleaseConnections da classe base ScriptComponent para fechar e liberar a conexão aberta anteriormente no método AcquireConnections.
Dim connMgr As IDTSConnectionManager100
...
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
IDTSConnectionManager100 connMgr;
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
Mantenha-se atualizado com o Integration Services
Para obter os downloads, artigos, exemplos e vídeos mais recentes da Microsoft, bem como soluções selecionadas da comunidade, visite a página do Integration Services no MSDN:
Visite a página do Integration Services no MSDN
Para receber uma notificação automática dessas atualizações, assine os RSS feeds disponíveis na página.
Confira também
Configurando o componente de script no editor de componentes de script [Codificando e depurando o componente de script](.. /extending-packages-scripting/componente de script de fluxo de dados/codificação-e-depuração-do-componente-de-script.md