Adicionando tarefas programaticamente

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

As tarefas podem ser adicionadas aos seguintes tipos de objetos no motor de execução:

Estas classes são consideradas contentores e todas herdam a Executables propriedade. Os contentores podem conter uma coleção de tarefas, que são objetos executáveis processados pelo tempo de execução durante a execução do contentor. A ordem de execução dos objetos na coleção é determinada em qualquer PrecedenceConstraint conjunto em cada tarefa dos contentores. As restrições de precedência permitem a ramificação de execução com base no sucesso, falha ou conclusão de um Executable na coleção.

Cada contentor tem uma Executables coleção que contém os objetos individuais Executable . Cada tarefa executável herda e implementa o método e Validate o Execute método. Estes dois métodos são chamados pelo motor de tempo de execução para processar cada Executable.

Para adicionar uma tarefa a um pacote, precisas de um contentor com uma Executables coleção já existente. Na maioria das vezes, a tarefa que vais adicionar à coleção é um pacote. Para adicionar o novo executável de tarefa à coleção desse contentor, chama-se o Add método . O método tem um único parâmetro, uma string, que contém o nome CLSID, PROGID, stock ou CreationName da tarefa que está a adicionar.

Nomes das Tarefas

Embora possas especificar uma tarefa pelo nome ou pelo ID, o nome STOCK é o parâmetro mais usado no Add método. Para adicionar uma tarefa a um executável identificado pelo nome STOCK , use a seguinte sintaxe:

Executable exec = package.Executables.Add("STOCK:BulkInsertTask");  
  
Dim exec As Executable = package.Executables.Add("STOCK:BulkInsertTask")  
  

A lista seguinte mostra os nomes de cada tarefa usados após o nome STOCK .

  • ActiveXScriptTask

  • BulkInsertTask

  • ExecuteProcessTask

  • ExecutePackageTask

  • Exec80PackageTask

  • FileSystemTask

  • FTPTask

  • MSMQTask

  • PipelineTask

  • ScriptTask

  • SendMailTask

  • SQLTask

  • TransferStoredProceduresTask

  • TransferLoginsTask

  • TransferirErroMensagensTarefa

  • TransferJobsTask

  • TransferObjectsTask

  • TransferDatabaseTask

  • WebServiceTask

  • WmiDataReaderTask

  • WmiEventWatcherTarefa

  • XMLTask

Se preferir uma sintaxe mais explícita, ou se a tarefa que pretende adicionar não tiver o nome STOCK, pode adicionar a tarefa ao executável usando o seu nome longo. Esta sintaxe exige que também especifique o número de versão da tarefa.

Executable exec = package.Executables.Add(  
  "Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask, " +  
  "Microsoft.SqlServer.ScriptTask, Version=10.0.000.0, " +  
  "Culture=neutral, PublicKeyToken=89845dcd8080cc91");  
Dim exec As Executable = package.Executables.Add( _  
  "Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask, " & _  
  "Microsoft.SqlServer.ScriptTask, Version=10.0.000.0, " & _  
  "Culture=neutral, PublicKeyToken=89845dcd8080cc91")  

Pode obter o nome longo da tarefa programaticamente, sem precisar de especificar a versão da tarefa, usando a propriedade AssemblyQualifiedName da classe, como mostrado no exemplo seguinte. Este exemplo requer uma referência à Microsoft. Assembly SqlServer.SQLTask.

using Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask;  
...  
      Executable exec = package.Executables.Add(  
        typeof(Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask).AssemblyQualifiedName);  
Imports Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask  
...  
    Dim exec As Executable = package.Executables.Add( _  
      GetType(Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask.ExecuteSQLTask).AssemblyQualifiedName)  

O exemplo de código seguinte mostra como criar uma Executables coleção a partir de um novo pacote e depois adicionar uma tarefa de Sistema de Ficheiros e uma tarefa de Inserção em Massa à coleção, usando os seus nomes STOCK . Este exemplo requer uma referência à Microsoft. SqlServer.FileSystemTask e Microsoft. Assemblys de tarefas SqlServer.BulkInsert.

using System;  
using Microsoft.SqlServer.Dts.Runtime;  
using Microsoft.SqlServer.Dts.Tasks.FileSystemTask;  
using Microsoft.SqlServer.Dts.Tasks.BulkInsertTask;  
  
namespace Microsoft.SqlServer.Dts.Samples  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
      Package p = new Package();  
      // Add a File System task to the package.  
      Executable exec1 = p.Executables.Add("STOCK:FileSystemTask");  
      TaskHost thFileSystemTask = exec1 as TaskHost;  
      // Add a Bulk Insert task to the package.  
      Executable exec2 = p.Executables.Add("STOCK:BulkInsertTask");  
      TaskHost thBulkInsertTask = exec2 as TaskHost;  
  
      // Iterate through the package Executables collection.  
      Executables pExecs = p.Executables;  
      foreach (Executable pExec in pExecs)  
      {  
        TaskHost taskHost = (TaskHost)pExec;  
        Console.WriteLine("Type {0}", taskHost.InnerObject.ToString());  
      }  
      Console.Read();  
    }  
  }  
}  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports Microsoft.SqlServer.Dts.Tasks.FileSystemTask  
Imports Microsoft.SqlServer.Dts.Tasks.BulkInsertTask  
  
Module Module1  
  
  Sub Main()  
  
    Dim p As Package = New Package()  
    ' Add a File System task to the package.  
    Dim exec1 As Executable = p.Executables.Add("STOCK:FileSystemTask")  
    Dim thFileSystemTask As TaskHost = CType(exec1, TaskHost)  
    ' Add a Bulk Insert task to the package.  
    Dim exec2 As Executable = p.Executables.Add("STOCK:BulkInsertTask")  
    Dim thBulkInsertTask As TaskHost = CType(exec2, TaskHost)  
  
    ' Iterate through the package Executables collection.  
    Dim pExecs As Executables = p.Executables  
    Dim pExec As Executable  
    For Each pExec In pExecs  
      Dim taskHost As TaskHost = CType(pExec, TaskHost)  
      Console.WriteLine("Type {0}", taskHost.InnerObject.ToString())  
    Next  
    Console.Read()  
  
  End Sub  
  
End Module  

Amostra de saída:

Type Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask

Type Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask

Contentor TaskHost

A TaskHost classe é um contentor que não aparece na interface gráfica do utilizador, mas é muito importante na programação. Esta classe é um wrapper para cada tarefa. Tarefas que são adicionadas ao pacote usando o Add método como Executable objeto podem ser lançadas como objeto TaskHost . Quando uma tarefa é castada como TaskHost, pode usar propriedades e métodos adicionais na tarefa. Além disso, a própria tarefa pode ser acedida através da InnerObject propriedade do TaskHost. Dependendo das suas necessidades, pode decidir manter a tarefa como um TaskHost objeto para poder usar as propriedades da tarefa através da Properties coleção. A vantagem de usar o Properties é que podes escrever código mais genérico. Se precisar de código muito específico para uma tarefa, então deve lançar a tarefa para o objeto apropriado.

O seguinte exemplo de código mostra como lançar um TaskHost, thBulkInsertTask, que contém um BulkInsertTask, para um BulkInsertTask objeto.

BulkInsertTask myTask = thBulkInsertTask.InnerObject as BulkInsertTask;  
Dim myTask As BulkInsertTask = CType(thBulkInsertTask.InnerObject, BulkInsertTask)  

O exemplo de código seguinte mostra como projetar o executável para um TaskHost, e depois usar a InnerObject propriedade para determinar que tipo de executável está contido pelo host.

using System;  
using Microsoft.SqlServer.Dts.Runtime;  
using Microsoft.SqlServer.Dts.Tasks.FileSystemTask;  
using Microsoft.SqlServer.Dts.Tasks.BulkInsertTask;  
  
namespace Microsoft.SqlServer.Dts.Samples  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
      Package p = new Package();  
      // Add a File System task to the package.  
      Executable exec1 = p.Executables.Add("STOCK:FileSystemTask");  
      TaskHost thFileSystemTask1 = exec1 as TaskHost;  
      // Add a Bulk Insert task to the package.  
      Executable exec2 = p.Executables.Add("STOCK:BulkInsertTask");  
      TaskHost thFileSystemTask2 = exec2 as TaskHost;  
  
      // Iterate through the package Executables collection.  
      Executables pExecs = p.Executables;  
      foreach (Executable pExec in pExecs)  
      {  
        TaskHost taskHost = (TaskHost)pExec;  
        if (taskHost.InnerObject is Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask)  
        {  
          // Do work with FileSystemTask here.  
          Console.WriteLine("Found task of type {0}", taskHost.InnerObject.ToString());  
        }  
        else if (taskHost.InnerObject is Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask)  
        {  
          // Do work with BulkInsertTask here.  
          Console.WriteLine("Found task of type {0}", taskHost.InnerObject.ToString());  
        }  
        // Add additional statements to check InnerObject, if desired.  
      }  
      Console.Read();  
    }  
  }  
}  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports Microsoft.SqlServer.Dts.Tasks.FileSystemTask  
Imports Microsoft.SqlServer.Dts.Tasks.BulkInsertTask  
  
Module Module1  
  
  Sub Main()  
  
    Dim p As Package = New Package()  
    ' Add a File System task to the package.  
    Dim exec1 As Executable = p.Executables.Add("STOCK:FileSystemTask")  
    Dim thFileSystemTask1 As TaskHost = CType(exec1, TaskHost)  
    ' Add a Bulk Insert task to the package.  
    Dim exec2 As Executable = p.Executables.Add("STOCK:BulkInsertTask")  
    Dim thFileSystemTask2 As TaskHost = CType(exec2, TaskHost)  
  
    ' Iterate through the package Executables collection.  
    Dim pExecs As Executables = p.Executables  
    Dim pExec As Executable  
    For Each pExec In pExecs  
      Dim taskHost As TaskHost = CType(pExec, TaskHost)  
      If TypeOf taskHost.InnerObject Is Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask Then  
        ' Do work with FileSystemTask here.  
        Console.WriteLine("Found task of type {0}", taskHost.InnerObject.ToString())  
      ElseIf TypeOf taskHost.InnerObject Is Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask Then  
        ' Do work with BulkInsertTask here.  
        Console.WriteLine("Found task of type {0}", taskHost.InnerObject.ToString())  
      End If  
      ' Add additional statements to check InnerObject, if desired.  
    Next  
    Console.Read()  
  
  End Sub  
  
End Module  

Amostra de saída:

Found task of type Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask

Found task of type Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask

A Add instrução devolve um executável que é lançado para um TaskHost objeto a partir do objeto recém-criado Executable .

Para definir propriedades ou chamar métodos no novo objeto, tens duas opções:

  1. Use a Properties coleção dos TaskHost. Por exemplo, para obter uma propriedade do objeto, use th.Properties["propertyname"].GetValue(th)). Para definir uma propriedade, use th.Properties["propertyname"].SetValue(th, <value>);.

  2. Lança o InnerObject do TaskHost para a classe de tarefa. Por exemplo, para castar a tarefa Bulk Insert para a BulkInsertTask depois de ter sido adicionada a um pacote como um Executable e posteriormente cast para um TaskHost, use BulkInsertTask myTask = th.InnerObject as BulkInsertTask;.

Usar a TaskHost classe em código, em vez de castar para a classe específica da tarefa, tem as seguintes vantagens:

  • O TaskHostProperties fornecedor não requer referência ao assembly no código.

  • Podes programar rotinas genéricas que funcionam para qualquer tarefa, porque não precisas de saber o nome da tarefa em tempo de compilação. Estas rotinas genéricas incluem métodos em que se passa o nome da tarefa para o método, e o código do método funciona para todas as tarefas. Este é um bom método para escrever código de teste.

Lançar do TaskHost para a classe específica da tarefa tem as seguintes vantagens:

  • O projeto Visual Studio dá-te completude instruções (IntelliSense).

  • O código pode correr mais rápido.

  • Objetos específicos da tarefa permitem ligações precoces e as otimizações resultantes. Para mais informações sobre encadernação inicial e tardia, consulte o tópico "Encadernação Inicial e Tardia" em Visual Basic Language Concepts.

O seguinte exemplo de código expande o conceito de reutilização de código de tarefa. Em vez de lançar tarefas para as suas classes equivalentes específicas, o exemplo de código mostra como lançar o executável para um TaskHost, e depois usa o Properties para escrever código genérico em todas as tarefas.

using System;  
using Microsoft.SqlServer.Dts.Runtime;  
  
namespace Microsoft.SqlServer.Dts.Samples  
{  
  class Program  
  {  
    static void Main(string[] args)  
    {  
      Package package = new Package();  
  
      string[] tasks = { "STOCK:SQLTask", "STOCK:ScriptTask",   
        "STOCK:ExecuteProcessTask", "STOCK:PipelineTask",   
        "STOCK:FTPTask", "STOCK:SendMailTask", "STOCK:MSMQTask" };  
  
      foreach (string s in tasks)  
      {  
        TaskHost taskhost = package.Executables.Add(s) as TaskHost;  
        DtsProperties props = taskhost.Properties;  
        Console.WriteLine("Enumerating properties on " + taskhost.Name);  
        Console.WriteLine(" TaskHost.InnerObject is " + taskhost.InnerObject.ToString());  
        Console.WriteLine();  
  
        foreach (DtsProperty prop in props)  
        {  
          Console.WriteLine("Properties for " + prop.Name);  
          Console.WriteLine("Name : " + prop.Name);  
          Console.WriteLine("Type : " + prop.Type.ToString());  
          Console.WriteLine("Readable : " + prop.Get.ToString());  
          Console.WriteLine("Writable : " + prop.Set.ToString());  
          Console.WriteLine();  
        }  
      }  
      Console.Read();  
    }  
  }  
}  
Imports Microsoft.SqlServer.Dts.Runtime  
  
Module Module1  
  
  Sub Main()  
  
    Dim package As Package = New Package()  
  
    Dim tasks() As String = New String() {"STOCK:SQLTask", "STOCK:ScriptTask", _  
              "STOCK:ExecuteProcessTask", "STOCK:PipelineTask", _  
              "STOCK:FTPTask", "STOCK:SendMailTask", "STOCK:MSMQTask"}  
  
    For Each s As String In tasks  
  
      Dim taskhost As TaskHost = CType(package.Executables.Add(s), TaskHost)  
      Dim props As DtsProperties = taskhost.Properties  
      Console.WriteLine("Enumerating properties on " & taskhost.Name)  
      Console.WriteLine(" TaskHost.InnerObject is " & taskhost.InnerObject.ToString())  
      Console.WriteLine()  
  
      For Each prop As DtsProperty In props  
        Console.WriteLine("Properties for " + prop.Name)  
        Console.WriteLine(" Name : " + prop.Name)  
        Console.WriteLine(" Type : " + prop.Type.ToString())  
        Console.WriteLine(" Readable : " + prop.Get.ToString())  
        Console.WriteLine(" Writable : " + prop.Set.ToString())  
        Console.WriteLine()  
      Next  
  
    Next  
    Console.Read()  
  
  End Sub  
  
End Module