Como criar uma tarefa personalizada DTS, usando o Visual Basic .NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 328587
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
Este artigo explica como criar uma Data Transformation Services (DTS) personalizado tarefas usando o Microsoft Visual Basic. NET.

Você pode estender os recursos DTS, criar tarefas personalizadas usando o Visual Basic. NET. Depois de instalar e registrar tarefas personalizado, ele aparece na DTS Designer como as tarefas DTS padrão. Além disso, você pode usar todo o .NET Framework para criar tarefas personalizadas do DTS.

Além das etapas para criar uma tarefa personalizada DTS, este artigo também inclui as seguintes informações:
  • Código de exemplo para a tarefa personalizada, que está na seção "Criar, registrar e instalar a tarefa personalizada" neste artigo.
  • Uma descrição dos recursos adicionais que você pode implementar usando uma tarefa personalizada.
  • Referências a várias ferramentas que você pode usar durante o processo de desenvolvimento. (A menos que indicado em contrário, essas ferramentas estão incluídas no Visual Studio .NET e execute-los no prompt de comando Visual Studio. NET.)
back to the top

Criar um runtime callable wrapper para Dtspkg.dll

Se um componente do cliente baseado no Microsoft Windows .NET computador acessa um COM, você deve usar um invólucro de código não gerenciado (que o COM componente contém). Esse tipo de wrapper é um runtime callable wrapper (RCW) e criá-los das informações de biblioteca de tipo que expõe o Dtspkg.dll. Você pode usar a ferramenta Type Library Importer (Tlbimp. exe) para criar o RCW:
tlbimp.exe
"C:\Arquivos de Programas\Microsoft SQL Server\80\Tools\Binn\dtspkg.dll"
/out:Microsoft.SQLServer.DTSPkg80.dll
/keyfile:DTSPkg.snk
O / keyfile parâmetro assina Microsoft.SQLServer.DTSPkg80.dll com um nome forte usando o par de chaves público ou particular no DTSPkg.snk. Para criar o par de chaves está presente no DTSPkg.snk, use o Strong Name Tool (sn.exe):
sn.exe -k DTSPkg.snk
Porque você deve instalar o RCW no global assembly cache (GAC), você deve usar um nome forte como outros assemblies no GAC.

back to the top

Instalar o RCW no cache de assembly global

Instalar o RCW no GAC usando o global assembly Cache Tool (GACutil.exe):
/i Gacutil.exe Microsoft.SQLServer.DTSPkg80.dll
Depois de instalar o RCW, você pode adicioná-lo como uma referência a um projeto Visual Studio.NET translation from VPE for Csharp Class Library.

Depois de instalar o RCW, você pode adicioná-lo como uma referência a um projeto Visual Studio.NET Visual Basic Class Library. No entanto, você deve localizar o RCW; a instalação de um assembly no GAC não adiciona automaticamente-lo à lista de referências disponíveis.

back to the top

Escrever o código detalhes técnicos para a tarefa personalizada

O código de direcionamento principalmente manipula o registro de tarefas personalizado. Os assemblies .NET não expõem DllRegisterServer e fazer DllUnregisterServer pontos de entrada como componentes COM, mas você pode usar a classe ComRegisterFunctionAttribute para executar registro da tarefa e cancelamento de registro. Essa classe é uma parte do namespace System.Runtime.InteropServices .

Primeiro, você deve especificar um GUID e um identificador programático (ProgID) para a classe de tarefas personalizado. Você pode usar GUIDgen.exe para criar um GUID. Adicione o seguinte código na linha de antes da declaração da classe de tarefas personalizado:
<Guid("38ED4F80-9EF4-4752-8478-65D2DB3BA7DD"), _ComVisible(True), _ProgId("DTSCustomTaskNet.SimpleCustomTask")> _Public Class SimpleCustomTask    Implements CustomTask	'implementation of custom task				
O ProgID é feita up do Namespace raiz (geralmente o projeto nome, que é DTSCustomTaskNet neste exemplo) seguido pelo nome classe ( SimpleCustomTask ).

O código a seguir demonstra a implementação de uma função para executar o registro da tarefa. O código completo para a função é apresentado na seção "Criar, registro e instalar a tarefa personalizada" neste artigo.
    <System.Runtime.InteropServices.ComRegisterFunctionAttribute()> _    Shared Sub RegisterServer(ByVal t As Type)	'code to register custom task 				
a função de registro adiciona a seguinte subchave no Registro:
HKEY_CLASSES_ROOT\CLSID\38ED4F80-9EF4-4752-8478-65D2DB3BA7DD\Implemented Categories\ {10020200-EB1C-11CF-AE6E-00AA004A34D5}
O GUID 10020200-EB1C-11CF-AE6E-00AA004A34D5 é a classe CLSID (identificação) do objeto pacote DTS . Você deve fazer isso porque todas as tarefas personalizadas implementam a interface CustomTask . A função de registro, em seguida, adiciona a seguinte subchave no Registro:

HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks\38ED4F80-9EF4-4752-8478-65D2DB3BA7DD
A seguinte subchave lista o conteúdo do DTS cache de tarefas, que faz com que a tarefa personalizada para aparecer no DTS Designer:
HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks\
O código a seguir demonstra a implementação da função unregister para executar a remoção de tarefa. Para exibir a amostra de código completo para esta função, consulte o "criar, registrar e instalar a personalizar tarefas" seção neste artigo:
    <System.Runtime.InteropServices.ComUnregisterFunctionAttribute()> _    Shared Sub UnregisterServer(ByVal t As Type)	'code to unregister custom task 				
a função de cancelamento de registro remove a tarefa o cache de tarefas de DTS, excluindo a seguinte subchave do Registro:
HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks\38ED4F80-9EF4-4752-8478-65D2DB3BA7DD
Finalmente, a tarefa personalizada é exposta como um componente COM de interface dupla. Você criar uma interface padrão de todos os campos públicos, non-static, propriedades e métodos da classe. Adicione a seguinte linha de código após as instruções IMPORTS no arquivo de origem de tarefas personalizado:
<Assembly: ClassInterface(ClassInterfaceType.AutoDual)> 				
o código de direcionamento agora é concluído.

back to the top

Adicionar funcionalidade à tarefa personalizada

A seção "Criar, registro e instalar a tarefa personalizada" do artigo contém código para uma tarefa personalizada do DTS simples. A tarefa possui duas propriedades: nome e Descrição . Quando você executa a tarefa, o valor para a propriedade Description aparece em uma caixa de mensagem. Este exemplo representa o código mínimo que você deve usar para ter uma tarefa personalizada de DTS funcional. No entanto, você pode criar uma interface de usuário personalizado ao implementar a interface CustomTaskUI , mas que está além do escopo deste artigo. Implementando apenas a interface CustomTask , DTS Designer cria uma interface de usuário padrão para tarefas personalizado.

Todas as tarefas personalizadas do DTS implementam a interface CustomTask . A interface CustomTask é composta de duas propriedades, uma coleção e um método:
  • As propriedades de nome e Descrição .
  • A coleção de Propriedades .
  • O método execute .
Todas as tarefas personalizadas devem implementar as propriedades, a coleção de Propriedades e o método execute .
  • A propriedade Name identifica a tarefa no pacote DTS. Quando você coloca a tarefa na superfície de DTS Designer, o DTS Designer atribui um nome para a tarefa. Para a tarefa personalizada de exemplo, você pode modificar a propriedade Name . Isso é para fins de ilustração somente como manuais online do SQL Server recomenda que você não expõe a propriedade Name para o usuário porque isso desassocia a sua etapa da tarefa. É o seguinte trecho do tópico "DTS personalizar tarefas Fundamentals" nos manuais online do SQL Server:
    É recomendável que você não expõe a propriedade Name, especialmente em um modo de leitura/gravação. DTS Designer atribui um nome exclusivo para a tarefa quando o ícone de tarefa é colocado na planilha de design. Se você alterar o valor de Name, DTS Designer será procure a tarefa usando o nome antigo e falhar quando ele não é possível localizá-lo.
    Para contornar esse problema, use o recurso desconectado Editar no DTS Designer para alterar a propriedade TaskName da etapa que pertence a tarefa para refletir o novo nome.
  • Com a propriedade Description , você pode adicionar uma descrição significativa para a tarefa.
  • A coleção de Propriedades contém objetos de propriedade que identificam as propriedades de tarefas personalizado. Grade de propriedades para a tarefa aparece no DTS Designer, e ele obtém suas informações da coleção Properties . Definindo esta opção para retornar nada, o padrão DTS propriedades provedor é usado.
  • O método execute inclui a funcionalidade de tarefas personalizado. No exemplo, o método execute exibe o valor da propriedade Descrição da tarefa em uma caixa de mensagem. O método execute tem os quatro parâmetros a seguir:
    • pPackage : esta é uma referência ao objeto DTS Package2 pai. Você pode usar esse objeto para obter referências a outros objetos no pacote e modificar suas propriedades.
    • pPackageEvents : esta é uma referência para os eventos de um objeto Package2 . Você pode usar esse objeto para gerar eventos.
    • pPackageLog : esta é uma referência a um objeto PackageLog que representa o arquivo de log do pacote. Você pode usar esse objeto para gravar o log se você tiver ativado o log de pacote do DTS.
    • pTaskResult : Isso mantém o resultado da execução de pacote. Você pode ver os códigos de retorno para este parâmetro no tópico "DTSTaskExecResult" nos manuais online do SQL Server.
back to the top

Criar, registrar e instalar a tarefa personalizada

O procedimento a seguir contém o código para o exemplo de tarefas personalizado que é mencionado no artigo. Para criar e executar a tarefa personalizada, execute estas etapas:
  1. Crie o RCW para Dtspkg.dll. Esse procedimento é explicado na seção "Criar um runtime callable wrapper para Dtspkg.dll" deste artigo.
  2. Instale o RCW no GAC. Esse procedimento é explicado na seção "Instalar o RCW no global assembly cache" neste artigo.
  3. Criar uma nova biblioteca de classe do .NET do Visual Basic projeto.
  4. Adicione o seguinte código ao arquivo de classe. Use o GUID valor usando GUIDgen.exe e, em seguida, cole-o no arquivo de origem:
    Imports System.Runtime.InteropServicesImports Microsoft.SQLServer.DTSPkg80Imports Microsoft.Win32Imports System.Windows.Forms<Assembly: ClassInterface(ClassInterfaceType.AutoDual)> <Guid("38ED4F80-9EF4-4752-8478-65D2DB3BA7DD"), _ComVisible(True), _ProgId("DTSCustomTaskNet.SimpleCustomTask")> _Public Class SimpleCustomTask    Implements CustomTask    Private m_name As String    Private m_description As String    Public Sub New()        m_name = ""        m_description = ""    End Sub    Public Overloads Sub Execute(ByVal pPackage As Object, _        ByVal pPackageEvents As Object, ByVal pPackageLog As Object, _        ByRef pTaskResult As Microsoft.SQLServer.DTSPkg80.DTSTaskExecResult) _        Implements CustomTask.Execute        Try            DoExecute(pPackage, pPackageEvents, pPackageLog, pTaskResult)        Finally            If NOT IsNothing(pPackageLog) And (Marshal.IsComObject(pPackageLog)) Then                Marshal.ReleaseComObject(pPackageLog)            End If            If NOT IsNothing(pPackageEvents) And (Marshal.IsComObject(pPackageEvents)) Then                Marshal.ReleaseComObject(pPackageEvents)            End If        End Try    End Sub    Public Overloads Sub DoExecute(ByVal pPackage As Object, _        ByVal pPackageEvents As Object, ByVal pPackageLog As Object, _        ByRef pTaskResult As Microsoft.SQLServer.DTSPkg80.DTSTaskExecResult)        'Assume failure at the outset        pTaskResult = DTSTaskExecResult.DTSTaskExecResult_Failure        Try            Dim package As Package2 = CType(pPackage, Package2)            Dim packageEvents As PackageEvents = CType(pPackageEvents, PackageEvents)            Dim packageLog As PackageLog = CType(pPackageLog, PackageLog)            MessageBox.Show(Description)        Catch e As System.Runtime.InteropServices.COMException            Console.WriteLine(e)        Catch e As System.Exception            Console.WriteLine(e)        End Try        'Return success        pTaskResult = DTSTaskExecResult.DTSTaskExecResult_Success    End Sub    Public Overloads Property Description() As String _        Implements CustomTask.Description        Get            Return Me.m_description        End Get        Set(ByVal Value As String)            Me.m_description = Value        End Set    End Property    Public Overloads Property Name() As String Implements CustomTask.Name        Get            Return m_name        End Get        Set(ByVal Value As String)            Me.m_name = Value        End Set    End Property    Public Overloads ReadOnly Property Properties() _        As Microsoft.SQLServer.DTSPkg80.Properties _        Implements CustomTask.Properties        Get            Return Nothing        End Get    End Property    <System.Runtime.InteropServices.ComVisible(False)> _    Public Overrides Function ToString() As String        Return MyBase.ToString()    End Function    Const TASK_CACHE As String = "Software\Microsoft\Microsoft SQL Server\80\DTS\Enumeration\Tasks"    Const CATID_DTSCustomTask As String = "{10020200-EB1C-11CF-AE6E-00AA004A34D5}"    'Registration function for custom task    <System.Runtime.InteropServices.ComRegisterFunctionAttribute()> _    Shared Sub RegisterServer(ByVal t As Type)        Try            Dim guid As String = "{" + t.GUID.ToString() + "}"            guid = guid.ToUpper()            Console.WriteLine("RegisterServer {0}", guid)            Dim root As RegistryKey            Dim rk As RegistryKey            Dim nrk As RegistryKey            ' add COM Category in HKEY_CLASSES_ROOT            root = Registry.ClassesRoot            rk = root.OpenSubKey("CLSID\" & guid & "\Implemented Categories", True)            nrk = rk.CreateSubKey(CATID_DTSCustomTask)            nrk.Close()            rk.Close()            root.Close()            ' add to DTS Cache in HKEY_CURRENT_USER            root = Registry.CurrentUser            rk = root.OpenSubKey(TASK_CACHE, True)            nrk = rk.CreateSubKey(guid)            nrk.SetValue("", t.FullName)            nrk.Close()            rk.Close()            root.Close()        Catch e As Exception            System.Console.WriteLine(e.ToString())        End Try    End Sub 'RegisterServer    'Unregistration function for custom task    <System.Runtime.InteropServices.ComUnregisterFunctionAttribute()> _    Shared Sub UnregisterServer(ByVal t As Type)        Try            Dim guid As String = "{" & t.GUID.ToString() & "}"            guid = guid.ToUpper()            Console.WriteLine("UnregisterServer {0}", guid)            Dim root As RegistryKey            Dim rk As RegistryKey            ' delete from DTS Cache in HKEY_CURRENT_USER            root = Registry.CurrentUser            rk = root.OpenSubKey(TASK_CACHE, True)            rk.DeleteSubKey(guid, False)            rk.Close()            root.Close()            'Delete task related keys from HKEY_CLASSES_ROOT            root = Registry.ClassesRoot            rk = root.OpenSubKey("CLSID\\" + guid + "\\Implemented Categories", True)            rk.DeleteSubKey(CATID_DTSCustomTask, False)            rk.Close()            root.Close()            root = Registry.ClassesRoot            rk = root.OpenSubKey("CLSID\\" + guid, True)            rk.DeleteValue("DTSTaskDescription")            rk.Close()            root.Close()            root = Registry.ClassesRoot            rk = root.OpenSubKey("CLSID\\" + guid, True)            rk.DeleteSubKey(guid, False)            rk.Close()            root.Close()            '        Catch e As Exception            System.Console.WriteLine(e.ToString())        End Try    End SubEnd Class					
  5. Adicionar uma referência ao RCW que você criou na etapa 1 e, em seguida, adicione uma referência a System.Windows.Forms.dll .
  6. Crie tarefas personalizadas. A saída é um .NET assembly.
  7. Registrar e instalar o assembly de tarefas personalizado:
    1. Como você deve adicionar a tarefa personalizada no GAC, você precisa usar um nome forte. Como o RCW, você pode criar um arquivo de nome forte usando a ferramenta Strong Name:
      sn.exe -k CustomTask.snk
    2. Para criar o assembly de tarefas personalizado com o nome de alta segurança, editar ou adicionar a linha de código a seguir no arquivo AssemblyInfo.vb file:
      <assembly: AssemblyKeyFile("<path to CustomTask.snk>")>						
    3. Agora crie a tarefa usando o Visual Studio. NET. A saída é um assembly .NET:
      regasm.exe CustomTask.dll
      Observação : por executar a ferramenta de assembly do Registro (regasm.exe), necessários entradas do Registro são adicionadas que permitem DTS criar o .NET personalizado transparente classe da tarefa.
    4. A última etapa no desenvolvimento de uma tarefa personalizada do DTS é instalá-lo no GAC usando o global assembly Cache Tool (GACutil.exe):
      /i Gacutil.exe CustomTask.dll
      Para usar tarefas personalizado, abra DTS Designer no SQL Server Enterprise Manager e coloque a tarefa personalizada na superfície de design. Nas propriedades de tarefas personalizado, defina a propriedade Descrição e, em seguida, execute o pacote. O resultado é uma caixa de mensagem exibe o valor para a propriedade Description da tarefa.
  8. Criar um novo pacote DTS: in o DTS Designer no SQL Server Enterprise Manager, colocar a tarefa na superfície de design, abra as propriedades da tarefa e em seguida, defina a propriedade Descrição . Para obter informações adicionais, consulte a seção "Solução de problemas" neste artigo.
  9. Execute o pacote.
back to the top

Recursos adicionais

Remoção de uma tarefa personalizada

Para remover uma tarefa personalizada, removê-lo do GAC e, em seguida, usar a ferramenta de assembly do Registro para remover as entradas de registro apropriadas: gacutil.exe /u CustomTask
Regasm.exe /u CustomTask.dll


GACutil.exe espera que o nome do assembly como ele aparece no cache e não o nome do arquivo real. Para verificar esse nome, inicie o Windows Explorer e, em seguida, localize a pasta %SystemRoot%\Assembly.

back to the top

Suporte de log de pacote

O método execute contém o parâmetro pPackageLog que é uma referência ao arquivo de log de pacote. Para gravar uma mensagem definida pelo usuário para o arquivo de log, chame PackageLog.WriteStringToLog no método execute . (Você também pode usar o método WriteTaskRecord ; para obter informações adicionais, consulte SQL Server Books Online.)

Certifique-se que você habilite logon as propriedades do pacote DTS. Após ativar o log, use o código para verificar que o log está ativado antes de realmente escrever para o log:
    'Logging    If Not pPackageLog Is Nothing Then        CType(pPackageLog, PackageLog).WriteStringToLog("Testing.")    End If				
back to the top

Variáveis globais

Você pode usar a referência ao objeto Package2 no método execute para acessar variáveis globais. O exemplo a seguir utiliza uma variável global chamada "Test".
    'Global variables    MsgBox("Global variable: " & _         package.GlobalVariables.Item("Test").Value)				
back to the top

Alterar propriedades de outras tarefas

Você pode usar a referência ao objeto Package2 no método execute para alterar as propriedades de outras tarefas DTS. Para testar o seguinte código de exemplo, adicionar uma tarefa de processo de execução ao seu pacote, especificar Notepad.exe como o processo para iniciar e, em seguida, defina seja executado quando a tarefa personalizada for concluída. Este código de exemplo faz com que a tarefa iniciar o Windows Calculadora (calc.exe) em vez do bloco de notas:
    'Change properties of another task    Dim tsk As Task = package.Tasks.Item("DTSTask_DTSCreateProcessTask_1")    Dim ctsk As CustomTask = tsk.CustomTask    ctsk.Properties.Item("ProcessCommandLine").Value = "CALC.EXE"				
back to the top

Alterar propriedades de tarefas personalizado usando uma tarefa de script ActiveX

Como as tarefas DTS padrão, você pode alterar as propriedades de uma tarefa personalizada usando uma tarefa de Script ActiveX. O exemplo Visual Basic script a seguir demonstra duas maneiras de alterar a propriedade Description de tarefas personalizado:
Function Main()	set pkg = DTSGlobalVariables.Parent	set tsk = pkg.Tasks("CustomTaskName")	set cus = tsk.CustomTask	'using the Properties collection to change the Description property	tsk.Properties("Description").Value = "Description of custom task"	'directly referencing the property will also work	tsk.Description ="Description of custom task"	Main = DTSTaskExecResult_SuccessEnd Function				
back to the top

Implementar eventos de pacote

Para obter mais informações sobre como manipular eventos de pacote do DTS, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
321525Como usar eventos de pacote DTS no Visual Basic .NET
back to the top

Solução de problemas

Se você especificar uma propriedade de Descrição padrão para a tarefa personalizada em seu construtor, essa propriedade é ignorada quando você arrasta a tarefa no DTS Designer. DTS Designer tenta ler esse valor do registro; se não for encontrado, ele cria uma Descrição padrão ("DTSCustomTaskNet.SimpleCustomTask: indefinido") com base no ProgID. Ele também cria um exclusivo nome ("DTSTask_DTSCustomTaskNet.SimpleCustomTask_1") com base no ProgID.

Para especificar uma propriedade de Descrição padrão para a tarefa personalizada, insira o valor que você deseja no registro, adicionando o seguinte código para o sub-rotina RegisterServer no projeto exemplo:
            ' add default Description in HKEY_CLASSES_ROOT            Dim ctsk As DTSCustomTaskNet.SimpleCustomTask = _                New DTSCustomTaskNet.SimpleCustomTask()            root = Registry.ClassesRoot            rk = root.OpenSubKey("CLSID\\" + guid, True)            rk.SetValue("SimpleCustomTask default description", _                ctsk.Description)            nrk.Close()            rk.Close()            root.Close()				
back to the top
Referências
Para obter informações adicionais sobre como desenvolver tarefas personalizadas para o SQL Server 2000, consulte o tópico "Criando um DTS personalizado tarefa" nos manuais online do SQL Server: back to the top

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 328587 - Última Revisão: 12/07/2015 12:28:38 - Revisão: 6.3

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 64-bit Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition

  • kbnosurvey kbarchive kbmt kbhowtomaster kbinterop kbwindowsforms KB328587 KbMtpt
Comentários