Programowe dodawanie zadań

Dotyczy:SQL Server Środowisko SSIS Integration Runtime w usłudze Azure Data Factory

Zadania można dodawać do następujących typów obiektów w silniku czasowym uruchomienia:

Te klasy są traktowane jako pojemniki i wszystkie dziedziczą Executables tę własność. Kontenery mogą zawierać kolekcję zadań, czyli obiektów wykonywalnych przetwarzanych przez czas działania podczas wykonywania kontenera. Kolejność wykonywania obiektów w kolekcji jest ustalana przez dowolny PrecedenceConstraint zestaw na każdym zadaniu w kontenerach. Ograniczenia precedensu umożliwiają rozgałęzienie wykonania w zależności od sukcesu, porażki lub zakończenia w Executable kolekcji.

Każdy kontener ma kolekcję Executables zawierającą poszczególne Executable obiekty. Każde zadanie wykonywalne dziedziczy i implementuje Execute metodę oraz Validate metodę. Te dwie metody są wywoływane przez silnik czasowy do przetwarzania każdego .Executable

Aby dodać zadanie do pakietu, potrzebujesz kontenera z istniejącą kolekcją Executables . Najczęściej zadaniem, które dodasz do kolekcji, jest pakiet. Aby dodać nowy plik wykonywalny do kolekcji dla tego kontenera, wywołujesz metodę Add . Metoda ma jeden parametr, ciąg znaków, który zawiera nazwy CLSID, PROGID, STOCK lub CreationName zadania, które dodajesz.

Nazwy zadań

Chociaż możesz określić zadanie według nazwy lub ID, najczęściej używany w metodzie Add jest określenie STOCK. Aby dodać zadanie do pliku wykonywalnego oznaczonego nazwą STOCK , użyj następującej składni:

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

Poniższa lista pokazuje nazwy każdego zadania używanych po nazwie STOCK .

  • ActiveXScriptTask

  • BulkInsertTask

  • WykonajProcesZadanie

  • WykonajZadaniePakietu

  • Exec80PackageTask

  • FileSystemTask

  • FTPTask

  • MSMQTask

  • PipelineTask

  • ScriptTask

  • SendMailTask

  • SQLTask

  • Zadanie TransferStoredProcedures

  • TransferLoginsTask

  • Zadanie TransferErrorMessages

  • Zadanie TransferJobsTask

  • Zadanie TransferObjectsTask

  • Zadanie TransferDatabaseTask

  • WebServiceTask

  • WmiDataReaderZadanie

  • Zadanie WmiEventWatcherTask

  • XMLTask

Jeśli wolisz bardziej wyraźną składnię lub jeśli zadanie, które chcesz dodać, nie ma nazwy STOCK, możesz dodać zadanie do pliku wykonywalnego pod jego długą nazwą. Ta składnia wymaga również określenia numeru wersji zadania.

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

Długą nazwę zadania można uzyskać programatycznie, bez konieczności określania jej wersji, używając właściwości AssemblyQualifiedName tej klasy, jak pokazano w poniższym przykładzie. Ten przykład wymaga odniesienia do Microsoftu. SqlServer.SQLTask assembly.

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)  

Poniższy przykład kodu pokazuje, jak utworzyć kolekcję Executables z nowego pakietu, a następnie dodać zadanie systemu plików oraz zadanie Bulk Insert do kolekcji, używając ich nazw STOCK . Ten przykład wymaga odniesienia do Microsoftu. SqlServer.FileSystemTask i Microsoft. SqlServer.BulkInsertTask assemblies.

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  

Przykładowe dane wyjściowe:

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

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

Kontener TaskHost

Klasa ta TaskHost jest kontenerem, który nie pojawia się w graficznym interfejsie użytkownika, ale jest bardzo ważny w programowaniu. Ta klasa jest opakowaniem każdego zadania. Zadania dodawane do pakietu poprzez używanie Add metody jako obiektu Executable mogą być rzucane jako obiekt.TaskHost Gdy zadanie jest obracane jako , TaskHostmożesz użyć dodatkowych właściwości i metod na zadaniu. Ponadto samo zadanie można uzyskać za pomocą InnerObject własności .TaskHost W zależności od Twoich potrzeb możesz zdecydować się zachować zadanie jako obiekt, TaskHost aby móc korzystać z jego właściwości w kolekcji Properties . Zaletą korzystania z nich Properties jest to, że możesz pisać bardziej ogólny kod. Jeśli potrzebujesz bardzo specyficznego kodu dla zadania, powinieneś rzucić je na odpowiedni obiekt.

Poniższy przykład kodu pokazuje, jak rzucić TaskHost, thBulkInsertTask, który zawiera , BulkInsertTaskna obiekt.BulkInsertTask

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

Poniższy przykład kodu pokazuje, jak przerzucić plik wykonywalny na , TaskHosta następnie użyć InnerObject tej właściwości do określenia, jaki typ pliku wykonywalnego jest zawarty w hostze.

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  

Przykładowe dane wyjściowe:

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

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

Instrukcja Add zwraca plik wykonywalny, który jest przesyłany do obiektu TaskHost z nowo utworzonego Executable obiektu.

Aby ustawić właściwości lub wywołać metody na nowym obiekcie, masz dwie opcje:

  1. Użyj zbioru Properties .TaskHost Na przykład, aby uzyskać własność z obiektu, używamy th.Properties["propertyname"].GetValue(th)). Aby ustawić własność, używamy th.Properties["propertyname"].SetValue(th, <value>);.

  2. Rzuć to InnerObjectTaskHost klasa zadania. Na przykład, aby rzucić zadanie Bulk Insert na a BulkInsertTask po dodaniu go do pakietu jako , Executable a następnie do , TaskHostużyj BulkInsertTask myTask = th.InnerObject as BulkInsertTask;.

Użycie TaskHost tej klasy w kodzie, zamiast przesyłania do klasy specyficznej dla zadania, ma następujące zalety:

  • Dostawca TaskHostProperties nie wymaga odniesienia do asemblera w kodzie.

  • Możesz kodować ogólne procedury, które działają dla dowolnego zadania, ponieważ nie musisz znać nazwy zadania w momencie kompilacji. Takie ogólne procedury zawierają metody, w których przekazujesz nazwę zadania do metody, a kod metody działa dla wszystkich zadań. To dobra metoda pisania kodu testowego.

Rzucanie z klasy TaskHost do zadaniowej ma następujące zalety:

  • Projekt Visual Studio oferuje uzupełnianie zdań (IntelliSense).

  • Kod może działać szybciej.

  • Obiekty specyficzne dla zadań umożliwiają wczesne wiązanie i wynikające z nich optymalizacje. Więcej informacji o wczesnym i późnym wiązaniu można znaleźć w temacie "Wczesne i późne wiązanie" w Visual Basic Language Concepts.

Poniższy przykład kodu rozwija koncepcję ponownego wykorzystania kodu zadaniowego. Zamiast przesyłać zadania do ich konkretnych odpowiedników klas, przykład kodu pokazuje, jak wykalitować plik wykonywalny do , TaskHosta następnie używa do Properties pisania ogólnego kodu dla wszystkich zadań.

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