Språk

Lägga till uppgifter programmatiskt

Gäller för:SQL Server SSIS Integration Runtime i Azure Data Factory

Uppgifter kan läggas till följande typer av objekt i körtidsmotorn:

Dessa klasser betraktas som behållare, och de ärver alla egenskapen Executables . Containrar kan innehålla en samling uppgifter, som är exekverbara objekt som bearbetas av körningen under containerns exekvering. Körordningen för objekten i samlingen bestäms av en mängd PrecedenceConstraint på varje uppgift i containrarna. Precedensbegränsningar möjliggör exekveringsgrening baserat på framgång, misslyckande eller slutförande av en Executable i samlingen.

Varje behållare har en Executables samling som innehåller de enskilda Executable objekten. Varje körbar uppgift ärver och implementerar Execute metoden och Validate metoden. Dessa två metoder anropas av körtidsmotorn för att bearbeta varje Executable.

För att lägga till en uppgift i ett paket behöver du en behållare med en Executables befintlig samling. Oftast är uppgiften du lägger till i samlingen ett paket. För att lägga till den nya taskexekverbara filen i samlingen för den containern anropar Add du metoden . Metoden har en enda parameter, en sträng, som innehåller CLSID, PROGID, STOCK-beteckningen eller CreationName för den uppgift du lägger till.

Uppgiftsnamn

Även om du kan ange en uppgift med namn eller ID, är STOCK-namnet den parameter som oftast används i metoden Add . För att lägga till en uppgift i en körbar fil som identifieras med STOCK-namnet , använd följande syntax:

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

Följande lista visar namnen för varje uppgift som används efter STOCK-namnet.

  • ActiveXScriptTask

  • BulkInsertTask

  • ExecuteProcessTask

  • ExecutePackageTask

  • Exec80PackageTask

  • FilSystemuppgift

  • FTPTask

  • MSMQTask

  • PipelineTask

  • ScriptTask

  • SendMailTask

  • SQLTask

  • TransferStoredProceduresTask

  • TransferLoginsTask

  • TransferErrorMessagesTask

  • TransferJobsTask

  • TransferObjectsTask

  • TransferDatabaseTask

  • WebServiceTask

  • WmiDataReaderTask

  • WmiEventWatcherUppgift

  • XMLTask

Om du föredrar en mer explicit syntax, eller om uppgiften du vill lägga till inte har ett STOCK-namn, kan du lägga till uppgiften i den exekverbara filen med dess långa namn. Denna syntax kräver att du också anger versionsnumret för uppgiften.

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

Du kan programmera det långa namnet för uppgiften, utan att behöva specificera uppgiftsversionen, genom att använda egenskapen AssemblyQualifiedName för klassen, som visas i följande exempel. Detta exempel kräver en referens till Microsoft. 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)  

Följande kodexempel visar hur man skapar en Executables samling från ett nytt paket och sedan lägger till en filsystemuppgift och en Bulk Insert-uppgift till samlingen, genom att använda deras STOCK-beteckningar. Detta exempel kräver en referens till Microsoft. SqlServer.FileSystemTask och 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  

Exempel på utdata:

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

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

TaskHost-behållaren

Klassen TaskHost är en behållare som inte förekommer i det grafiska användargränssnittet, men är mycket viktig i programmering. Denna klass är en wrapper för varje uppgift. Uppgifter som läggs till i paketet genom att använda Add metoden som ett Executable objekt kan omvandlas till ett TaskHost objekt. När en uppgift kastas som en TaskHost, kan du använda ytterligare egenskaper och metoder på uppgiften. Dessutom kan själva uppgiften nås genom egenskapen InnerObject .TaskHost Beroende på dina behov kan du välja att behålla uppgiften som ett TaskHost objekt så att du kan använda uppgiftens egenskaper genom samlingen Properties . Fördelen med att använda är Properties att du kan skriva mer generisk kod. Om du behöver mycket specifik kod för en uppgift bör du casta uppgiften till dess lämpliga objekt.

Följande kodexempel visar hur man kastar en TaskHost, thBulkInsertTask, som innehåller ett BulkInsertTask, till ett BulkInsertTask objekt.

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

Följande kodexempel visar hur man castar den exekverbara filen till en TaskHost, och sedan använder egenskapen InnerObject för att avgöra vilken typ av exekverbar fil som finns hos värden.

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  

Exempel på utdata:

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

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

Satsen Add returnerar en exekverbar fil som kastas till ett TaskHost objekt från det nyskapade Executable objektet.

För att sätta egenskaper eller anropa metoder på det nya objektet har du två alternativ:

  1. Använd samlingen Properties av TaskHost. Till exempel, för att erhålla en egenskap från objektet, använd th.Properties["propertyname"].GetValue(th)). För att sätta en egenskap, använd th.Properties["propertyname"].SetValue(th, <value>);.

  2. Kasta av InnerObject till TaskHost uppgiftsklassen. Till exempel, för att kasta Bulk Insert-uppgiften till en BulkInsertTask efter att den har lagts till i ett paket som en Executable och därefter kastas till en TaskHost, använd BulkInsertTask myTask = th.InnerObject as BulkInsertTask;.

Att använda TaskHost klassen i kod, istället för att kasta till den uppgiftsspecifika klassen, har följande fördelar:

  • Leverantören TaskHostProperties kräver ingen referens till sammansättningen i koden.

  • Du kan koda generiska rutiner som fungerar för vilken uppgift som helst, eftersom du inte behöver veta namnet på uppgiften vid kompilering. Sådana generiska rutiner inkluderar metoder där du skickar in namnet på uppgiften till metoden, och metodkoden fungerar för alla uppgifter. Detta är en bra metod för att skriva testkod.

Att kasta från till TaskHost uppgiftsspecifik klass har följande fördelar:

  • Visual Studio-projektet ger dig statement completion (IntelliSense).

  • Koden kan gå snabbare.

  • Uppgiftsspecifika objekt möjliggör tidig bindning och de resulterande optimeringarna. För mer information om tidig och sen bindning, se ämnet "Early and Late Binding" i Visual Basic Language Concepts.

Följande kodexempel utvecklar konceptet att återanvända uppgiftskod. Istället för att casta uppgifter till deras specifika klassmotsvarigheter visar kodexemplet hur man kastar den exekverbara filen till en TaskHost, och använder sedan för Properties att skriva generisk kod mot alla uppgifter.

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