プログラムによるタスクの追加

適用対象: SQL Server Azure Data Factory の SSIS 統合ランタイム

ランタイム エンジン内の次の種類のオブジェクトに、タスクを追加できます。

これらのクラスはコンテナーと見なされ、すべて Executables プロパティを継承します。 コンテナーにはタスクのコレクションを含めることができます。これらのタスクは、コンテナーの実行中にランタイムによって処理される実行可能オブジェクトです。 コレクション内のオブジェクトの実行順序は、コンテナー内の各タスクに設定された PrecedenceConstraint によって決まります。 優先順位制約によって、コレクション内の Executable の成功、失敗、または完了に基づく、実行の分岐ができます。

各コンテナーには、個々の Executables オブジェクトを含んでいる Executable コレクションがあります。 各実行可能タスクは Execute メソッドおよび Validate メソッドを継承して実装します。 これらの 2 つのメソッドはランタイム エンジンによって呼び出され、各 Executable を処理します。

パッケージにタスクを追加するには、Executables の既存のコレクションを持つコンテナーが必要です。 ほとんどの場合、コレクションに追加するタスクはパッケージです。 新しいタスクの実行可能ファイルをそのコンテナーのコレクションに追加するには、Add メソッドを呼び出します。 このメソッドには単一の文字列パラメーターがあり、CLSID、PROGID、STOCK モニカー、または、追加するタスクの CreationName が格納されます。

タスク名

名前または ID でタスクを指定できますが、Add メソッドで最もよく使用されるパラメーターは STOCK モニカーです。 STOCK モニカーによって識別される実行可能ファイルにタスクを追加するには、次の構文を使用します。

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

次の一覧は、STOCK モニカーの後に使用する各タスクの名前を示したものです。

  • ActiveXScriptTask

  • BulkInsertTask

  • ExecuteProcessTask

  • ExecutePackageTask

  • Exec80PackageTask

  • FileSystemTask

  • FTPTask

  • MSMQTask

  • PipelineTask

  • ScriptTask

  • SendMailTask

  • SQLTask

  • TransferStoredProceduresTask

  • TransferLoginsTask

  • TransferErrorMessagesTask

  • TransferJobsTask

  • TransferObjectsTask

  • TransferDatabaseTask

  • WebServiceTask

  • WmiDataReaderTask

  • WmiEventWatcherTask

  • XMLTask

明示的な構文を使用する場合、または追加しようとするタスクに STOCK モニカーがない場合は、長い名前を使用して実行可能ファイルにタスクを追加できます。 この構文では、タスクのバージョン番号も指定する必要があります。

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

タスクのバージョンを指定しないで、次の例のようにクラスの AssemblyQualifiedName プロパティを使用して、プログラムによってタスクの長い名前を取得できます。 この例では、Microsoft.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)  

次のコード例は、新しいパッケージから Executables コレクションを作成し、STOCK モニカーを使用してファイル システム タスクと一括挿入タスクをコレクションに追加する方法を示しています。 この例では、Microsoft.SqlServer.FileSystemTask および Microsoft.SqlServer.BulkInsertTask アセンブリへの参照が必要です。

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  

サンプル出力:

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

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

TaskHost コンテナー

TaskHost クラスは、グラフィカル ユーザー インターフェイスには出現しないコンテナーですが、プログラムを作成する際には非常に重要です。 このクラスは、すべてのタスク用のラッパーです。 Add メソッドを Executable オブジェクトとして使用してパッケージに追加されたタスクは、TaskHost オブジェクトとしてキャストできます。 タスクが TaskHost としてキャストされる場合は、タスクの追加プロパティおよびメソッドを使用できます。 また、タスク自体には、InnerObjectTaskHost プロパティをとおしてアクセスできます。 必要に応じて、タスクを TaskHost オブジェクトとして保持し、Properties コレクションをとおしてタスクのプロパティを使用することができます。 Properties を使用する利点は、汎用性の高いコードを記述できることです。 タスク固有のコードが必要な場合は、タスクを適切なオブジェクトにキャストする必要があります。

次のコード例は、TaskHost を含む BulkInsertTask、thBulkInsertTask を BulkInsertTask オブジェクトにキャストする方法を示しています。

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

次のコード例は、実行可能ファイルを TaskHost にキャストし、次に InnerObject プロパティを使用して、ホストに含まれている実行可能ファイルの種類を特定する方法を示しています。

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  

サンプル出力:

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

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

Add ステートメントは、新しく作成された TaskHost オブジェクトから Executable オブジェクトにキャストされる実行可能ファイルを返します。

新しいオブジェクトのプロパティの設定またはメソッドの呼び出しを行う場合、2 つのオプションを使用できます。

  1. PropertiesTaskHost コレクションを使用します。 たとえば、オブジェクトからプロパティを取得するには、th.Properties["propertyname"].GetValue(th)) を使用します。 プロパティを設定するには、th.Properties["propertyname"].SetValue(th, <value>); を使用します。

  2. InnerObjectTaskHost をタスク クラスにキャストします。 たとえば、一括挿入タスクが BulkInsertTask としてパッケージに追加され、その後 Executable にキャストされた後で、このタスクを TaskHost にキャストするには、BulkInsertTask myTask = th.InnerObject as BulkInsertTask; を使用します。

タスク固有のクラスにキャストする代わりに TaskHost クラスをコードで使用する場合、次の利点があります。

  • TaskHostProperties プロバイダーは、コード内でアセンブリを参照する必要がありません。

  • コンパイル時にタスクの名前を知る必要がないため、すべてのタスクで動作する汎用ルーチンをコーディングできます。 このような汎用ルーチンには、タスク名を引数として受け取るメソッドが含まれます。このメソッド コードはすべてのタスクで動作します。 これは、テスト コードを記述するのに適したメソッドです。

TaskHost からタスク固有のクラスにキャストする場合、次の利点があります。

  • Visual Studio プロジェクトからステートメントの完了が提供されます (IntelliSense)。

  • コードの実行が高速化する場合があります。

  • タスク固有のオブジェクトを使用すると、事前バインドおよび結果の最適化が有効になります。 事前バインドおよび遅延バインドの詳細については、「Visual Basic 言語の概念」の「事前バインドと遅延バインド」を参照してください。

次のコード例は、タスク コードの再利用の概念について、詳細を示しています。 このコード例では、タスクを同等のクラスにキャストせず、代わりに実行可能ファイルを TaskHost にキャストしてから、Properties を使用してすべてのタスクに対する汎用コードを記述する方法を示しています。

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  

外部リソース

blogs.msdn.com のブログ「EzAPI - Updated for SQL Server 2012」(EzAPI - SQL Server 2012 用の更新)

参照

プログラムによるタスクの接続