다음을 통해 공유


프로그래밍 방식으로 태스크 추가

적용 대상: Azure Data Factory의 SQL Server SSIS Integration Runtime

태스크는 런타임 엔진에서 다음 유형의 개체에 추가할 수 있습니다.

이러한 클래스는 컨테이너로 간주되며 모두 속성을 상속합니다 Executables . 컨테이너는 컨테이너를 실행하는 동안 런타임에서 처리되는 실행 개체인 태스크 컬렉션을 포함할 수 있습니다. 컬렉션에 있는 개체의 실행 순서는 컨테이너의 각 태스크에 설정된 PrecedenceConstraint에 따라 결정됩니다. 선행 제약 조건을 사용하면 컬렉션에 있는 Executable의 성공, 실패 또는 완료 상태에 따라 실행을 분기할 수 있습니다.

각 컨테이너에는 Executables 개별 Executable 개체를 포함하는 컬렉션이 있습니다. 각 실행 태스크는 Execute 메서드와 Validate 메서드를 상속하고 구현합니다. 런타임 엔진에서는 이 두 메서드를 호출하여 각 Executable을 처리합니다.

패키지에 작업을 추가하려면 기존 컬렉션이 있는 컨테이너가 Executables 필요합니다. 대부분의 경우 컬렉션에 추가할 태스크는 패키지입니다. 새 작업 실행 파일을 해당 컨테이너의 컬렉션에 추가하려면 메서드를 호출합니다 Add . 메서드에는 CLSID, PROGID, STOCK 모니커 또는 CreationName 추가하는 작업의 단일 매개 변수, 문자열이 있습니다.

작업 이름

이름 또는 ID 로 작업을 지정할 수 있지만 STOCK 모니커는 메서드에서 Add 가장 자주 사용되는 매개 변수입니다. 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 속성을 통해 태스크 자체에 액세스할 수 있습니다. 필요에 따라 컬렉션을 통해 Properties 태스크의 속성을 사용할 수 있도록 작업을 개체로 TaskHost 유지하도록 결정할 수 있습니다. 이 기능을 사용하면 Properties 더 많은 제네릭 코드를 작성할 수 있다는 장점이 있습니다. 작업에 매우 구체적인 코드가 필요한 경우 해당 개체로 태스크를 캐스팅해야 합니다.

다음 코드 예제에서는 포함하는 thBulkInsertTaskBulkInsertTask를 개체로 캐스팅TaskHost하는 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 새로 만든 Executable 개체에서 개체로 TaskHost 캐스팅되는 실행 파일을 반환합니다.

속성을 설정하거나 새 개체에서 메서드를 호출하려면 다음 두 가지 옵션이 있습니다.

  1. Properties 컬렉션을 TaskHost사용합니다. 예를 들어 개체에서 속성을 가져오려면 .를 사용합니다 th.Properties["propertyname"].GetValue(th)). 속성을 설정하려면 .를 사용합니다 th.Properties["propertyname"].SetValue(th, <value>);.

  2. InnerObject 작업 클래스에 TaskHost 캐스팅합니다. 예를 들어 대량 삽입 태스크를 패키지에 BulkInsertTask 추가한 후 패키지로 캐스팅한 후 다음으로 Executable 캐스팅하려면 다음을 TaskHost사용합니다 BulkInsertTask myTask = th.InnerObject as BulkInsertTask;.

태스크별 클래스로 캐스팅하는 대신 코드에서 TaskHost 클래스를 사용하면 다음과 같은 장점이 있습니다.

  • 공급자는 TaskHostProperties 코드의 어셈블리에 대한 참조가 필요하지 않습니다.

  • 컴파일 시간에 작업의 이름을 알 필요가 없으므로 모든 작업에 대해 작동하는 제네릭 루틴을 코딩할 수 있습니다. 이러한 제네릭 루틴에는 태스크 이름을 메서드에 전달하는 메서드가 포함되며 메서드 코드는 모든 작업에 대해 작동합니다. 이 방법은 테스트 코드를 작성하는 데 적합합니다.

TaskHost 작업별 클래스로 캐스팅하면 다음과 같은 이점이 있습니다.

  • Visual Studio 프로젝트는 문 완성(IntelliSense)을 제공합니다.

  • 코드가 더 빠르게 실행 될 수 있습니다.

  • 태스크별 개체를 사용하면 초기 바인딩 및 결과 최적화 기능을 사용할 수 있습니다. 초기 바인딩 및 지연 바인딩에 대한 자세한 내용은 Visual Basic 언어 개념의 "초기 바인딩 및 지연 바인딩" 항목을 참조하세요.

다음 코드 예에서는 태스크 코드 재사용의 개념을 확장하여, 태스크를 해당 클래스에 해당하는 클래스로 캐스팅하는 대신, 코드 예제에서는 실행 파일을 a 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  

외부 리소스

블로그 항목인 EzAPI - blogs.msdn.com SQL Server 2012용으로 업데이트되었습니다.

참고 항목

프로그래밍 방식으로 작업 연결