Programové přidávání úkolů

Platí pro:SQL Server SSIS Integration Runtime v rámci Azure Data Factory

Úlohy lze přidávat k následujícím typům objektů v run-time enginu:

Tyto třídy jsou považovány za kontejnery a všechny dědí vlastnost Executables . Kontejnery mohou obsahovat kolekci úloh, což jsou spustitelné objekty zpracované během běhu kontejneru. Pořadí provádění objektů v kolekci je určeno libovolnou PrecedenceConstraint množinou na každém úkolu v kontejnerech. Omezení přednosti umožňují větvení provedení na základě úspěchu, neúspěchu nebo dokončení v Executable kolekci.

Každý kontejner má kolekci, Executables která obsahuje jednotlivé Executable objekty. Každý spustitelný úkol dědí a implementuje Execute metodu a Validate metodu. Tyto dvě metody jsou vyvolány run-time enginem k zpracování každé .Executable

Pro přidání úkolu do balíčku potřebujete kontejner s existující Executables kolekcí. Většinou je úkol, který do kolekce přidáte, jen balíček. Pro přidání nového spustitelného souboru úlohy do kolekce pro tento kontejner se použije metoda Add . Metoda má jeden parametr, řetězec, který obsahuje názvy CLSID, PROGID, STOCK nebo CreationName úkolu, který přidáváte.

Názvy úkolů

Ačkoliv můžete zadat úkol podle názvu nebo podle ID, nejčastěji používaný Add parametr je STOCK. Pro přidání úkolu k spustitelnému souboru označenému názvem STOCK použijte následující syntaxi:

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

Následující seznam ukazuje názvy jednotlivých úkolů, které jsou používány za označením STOCK .

  • ActiveXScriptTask

  • BulkInsertTask

  • ExecuteProcessTask

  • ExecutePackageTask

  • Exec80PackageTask

  • FileSystemTask

  • FTPTask

  • MSMQTask

  • PipelineTask

  • ScriptTask

  • SendMailTask

  • SQLTask

  • Úkol TransferStoredProcedures

  • TransferLoginsTask

  • Úkol PřenosChybyZpráv

  • Úkol TransferJobs

  • Úkol TransferObjects

  • TransferDatabaseTask

  • WebServiceTask

  • WmiDataReaderTask

  • Úkol WmiEventWatcher

  • XMLTask

Pokud preferujete explicitnější syntaxi, nebo pokud úkol, který chcete přidat, nemá označení STOCK, můžete úkol přidat do spustitelného souboru pod jeho dlouhým názvem. Tato syntaxe vyžaduje, abyste také zadali číslo verze úkolu.

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

Dlouhý název úkolu můžete získat programovaně, aniž byste museli specifikovat verzi úkolu, použitím vlastnosti třídy AssemblyQualifiedName , jak je ukázáno v následujícím příkladu. Tento příklad vyžaduje odkaz na Microsoft. SqlServer.SQLTask assembler.

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)  

Následující příklad kódu ukazuje, jak vytvořit Executables kolekci z nového balíčku a poté přidat do kolekce úlohu souborového systému a úlohu Bulk Insert, přičemž použijete jejich názvy STOCK . Tento příklad vyžaduje odkaz na Microsoft. SqlServer.FileSystemTask a 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  

Ukázkový výstup:

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

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

TaskHost Container

Tato TaskHost třída je kontejner, který se v grafickém uživatelském rozhraní neobjevuje, ale je velmi důležitý v programování. Tato třída je obalem pro každý úkol. Úkoly, které jsou do balíčku přidány pomocí Add metody jako objektuExecutable, mohou být vykresleny jako objekt.TaskHost Když je úkol vykreslen jako , TaskHostmůžete na úkol použít další vlastnosti a metody. Také samotný úkol lze získat prostřednictvím InnerObject vlastnosti .TaskHost Podle vašich potřeb se můžete rozhodnout úkol ponechat jako objekt, TaskHost abyste mohli využívat vlastnosti úkolu prostřednictvím Properties kolekce. Výhodou použití je Properties , že můžete psát obecnější kód. Pokud potřebujete velmi specifický kód pro úkol, měli byste úkol přenést na jeho příslušný objekt.

Následující příklad kódu ukazuje, jak převést TaskHost, thBulkInsertTask, který obsahuje , BulkInsertTaskna objekt.BulkInsertTask

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

Následující příklad kódu ukazuje, jak přehrát spustitelný soubor na , TaskHosta poté použít vlastnost InnerObject k určení, jaký typ spustitelného souboru hostitel obsahuje.

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  

Ukázkový výstup:

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

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

Příkaz Add vrátí spustitelný soubor, který je přenášen na TaskHost objekt z nově vytvořeného Executable objektu.

Pro nastavení vlastností nebo volání metod na novém objektu máte dvě možnosti:

  1. Použijte Properties kolekci .TaskHost Například pro získání vlastnosti z objektu použijeme th.Properties["propertyname"].GetValue(th)). Pro nastavení vlastnosti použijte th.Properties["propertyname"].SetValue(th, <value>);.

  2. Sesílejte třídu InnerObject úkolu z úkolu TaskHost . Například pro převedení úlohy Bulk Insert do a BulkInsertTask poté, co byla přidána do balíčku jako a Executable a následně přenesete do , TaskHostpoužijte BulkInsertTask myTask = th.InnerObject as BulkInsertTask;.

Použití třídy TaskHost v kódu místo castingu do třídy specifické pro úkol má následující výhody:

  • Poskytovatel TaskHostProperties nevyžaduje odkaz na sestavení v předpisu.

  • Můžete naprogramovat obecné rutiny, které fungují pro jakýkoli úkol, protože nemusíte znát název úkolu při kompilaci. Takové obecné rutiny zahrnují metody, kdy předáte název úkolu metodě a kód metody funguje pro všechny úkoly. Je to dobrá metoda pro psaní testovacího kódu.

Sesávání z do TaskHost úkolově specifické třídy má následující výhody:

  • Projekt Visual Studio vám umožní dokončit výroky (IntelliSense).

  • Kód může běžet rychleji.

  • Objekty specifické pro úkol umožňují rané binování a následné optimalizace. Pro více informací o raném a pozdním bindingu viz téma "Early and Late binding" v Visual Basic Language Concepts.

Následující příklad kódu rozšiřuje koncept opětovného využití kódu úloh. Místo přenášení úloh do jejich konkrétních třídních ekvivalentů ukazuje příklad kódu, jak přenést spustitelný soubor do , TaskHosta poté používá k Properties napsání generického kódu proti všem úkolům.

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