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

런타임 엔진에서 다음과 같은 유형의 개체에 태스크를 추가할 수 있습니다.Tasks can be added to the following types of objects in the run-time engine:

  • Package

  • Sequence

  • ForLoop

  • ForEachLoop

  • DtsEventHandler

    이러한 클래스는 컨테이너로 간주되며 모두 Executables 속성을 상속합니다.These classes are considered containers, and they all inherit the Executables property. 컨테이너에는 해당 컨테이너를 실행하는 동안 런타임에서 처리할 수 있는 실행 개체인 태스크의 컬렉션이 포함될 수 있습니다.Containers can contain a collection of tasks, which are executable objects processed by the runtime during execution of the container. 컬렉션에 있는 개체의 실행 순서는 컨테이너의 각 태스크에 설정된 PrecedenceConstraint에 따라 결정됩니다.The order of execution of the objects in the collection is determined any PrecedenceConstraint set on each task in the containers. 선행 제약 조건을 사용하면 컬렉션에 있는 Executable의 성공, 실패 또는 완료 상태에 따라 실행을 분기할 수 있습니다.Precedence constraints enable execution branching based on the success, failure, or completion of an Executable in the collection.

    각 컨테이너에는 개별 Executables 개체가 들어 있는 Executable 컬렉션이 있습니다.Each container has an Executables collection that contains the individual Executable objects. 각 실행 태스크는 Execute 메서드와 Validate 메서드를 상속하고 구현합니다.Each executable task inherits and implements the Execute method and Validate method. 런타임 엔진에서는 이 두 메서드를 호출하여 각 Executable을 처리합니다.These two methods are called by the run-time engine to process each Executable.

    패키지에 태스크를 추가하려면 기존 Executables 컬렉션이 있는 컨테이너가 필요합니다.To add a task to a package, you need a container with an Executables existing collection. 대부분의 경우 컬렉션에 추가할 태스크는 패키지입니다.Most of the time, the task that you will add to the collection is a package. 새 태스크 실행 파일을 해당 컨테이너의 컬렉션에 추가하려면 Add 메서드를 호출합니다.To add the new task executable into the collection for that container, you call the Add method . 이 메서드에는 추가할 태스크의 CLSID, PROGID, STOCK 모니커 또는 CreationName이 들어 있는 단일 문자열 매개 변수가 있습니다.The method has a single parameter, a string, that contains the CLSID, PROGID, STOCK moniker, or CreationName of the task you are adding.

태스크 이름Task Names

태스크는 이름이나 ID로 지정할 수 있지만 Add 메서드에서 가장 자주 사용되는 매개 변수는 STOCK 모니커입니다.Although you can specify a task by name or by ID, the STOCK moniker is the parameter used most often in the Add method. STOCK 모니커로 식별된 실행 파일에 태스크를 추가하려면 다음 구문을 사용합니다.To add a task to an executable identified by the STOCK moniker, use the following syntax:

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

다음 목록에서는 STOCK 모니커 다음에 사용되는 각 태스크의 이름을 보여 줍니다.The following list shows the names for each task that are used after the STOCK moniker.

  • ActiveXScriptTaskActiveXScriptTask

  • BulkInsertTaskBulkInsertTask

  • ExecuteProcessTaskExecuteProcessTask

  • ExecutePackageTaskExecutePackageTask

  • Exec80PackageTaskExec80PackageTask

  • FileSystemTaskFileSystemTask

  • FTPTaskFTPTask

  • MSMQTaskMSMQTask

  • PipelineTaskPipelineTask

  • ScriptTaskScriptTask

  • SendMailTaskSendMailTask

  • SQLTaskSQLTask

  • TransferStoredProceduresTaskTransferStoredProceduresTask

  • TransferLoginsTaskTransferLoginsTask

  • TransferErrorMessagesTaskTransferErrorMessagesTask

  • TransferJobsTaskTransferJobsTask

  • TransferObjectsTaskTransferObjectsTask

  • TransferDatabaseTaskTransferDatabaseTask

  • WebServiceTaskWebServiceTask

  • WmiDataReaderTaskWmiDataReaderTask

  • WmiEventWatcherTaskWmiEventWatcherTask

  • XMLTaskXMLTask

    보다 명시적인 구문을 사용하려는 경우나 추가할 태스크에 STOCK 모니커가 없는 경우에는 긴 이름을 사용하여 실행 파일에 태스크를 추가할 수 있습니다.If you prefer a more explicit syntax, or if the task that you want to add does not have a STOCK moniker, you can add the task to the executable using its long name. 이 구문을 사용하려면 태스크의 버전 번호도 지정해야 합니다.This syntax requires that you also specify the version number of the task.

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 속성을 사용하면 태스크 버전을 지정하지 않고도 프로그래밍 방식으로 태스크의 긴 이름을 가져올 수 있습니다.You can obtain the long name for the task programmatically, without having to specify the task version, by using the AssemblyQualifiedName property of the class, as shown in the following example. 이 예에는 Microsoft.SqlServer.SQLTask 어셈블리에 대한 참조가 필요합니다.This example requires a reference to the 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)  

다음 코드 예에서는 새 패키지에서 Executables 컬렉션을 만든 다음 STOCK 모니커를 사용하여 컬렉션에 파일 시스템 태스크 및 대량 삽입 태스크를 추가하는 방법을 보여 줍니다.The following code example shows how to create an Executables collection from a new package, and then add a File System task and a Bulk Insert task to the collection, by using their STOCK monikers. 이 예에는 Microsoft.SqlServer.FileSystemTask 및 Microsoft.SqlServer.BulkInsertTask 어셈블리에 대한 참조가 필요합니다.This example requires a reference to the Microsoft.SqlServer.FileSystemTask and 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  

샘플 출력:Sample Output:

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

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

TaskHost 컨테이너TaskHost Container

TaskHost 클래스는 그래픽 사용자 인터페이스에는 나타나지 않는 컨테이너이지만 프로그래밍에서 매우 중요합니다.The TaskHost class is a container that does not appear in the graphical user interface, but is very important in programming. 이 클래스는 모든 태스크에 대한 래퍼입니다.This class is a wrapper for every task. Add 메서드를 사용하여 Executable 개체로 패키지에 추가된 태스크는 TaskHost 개체로 캐스팅할 수 있습니다.Tasks that are added to the package by using the Add method as an Executable object can be cast as a TaskHost object. 태스크를 TaskHost로 캐스팅하면 태스크에서 추가 속성 및 메서드를 사용할 수 있습니다.When a task is cast as a TaskHost, you can use additional properties and methods on the task. 또한 InnerObjectTaskHost 속성을 통해 태스크 자체에 액세스할 수 있습니다.Also, the task itself can be accessed through the InnerObject property of the TaskHost. 필요에 따라 TaskHost 컬렉션을 통해 태스크의 속성을 사용할 수 있도록 태스크를 Properties 개체로 유지할 수 있습니다.Depending on your needs, you may decide to keep the task as a TaskHost object so that you can use the properties of the task through the Properties collection. Properties를 사용하면 보다 일반적인 코드를 작성할 수 있다는 장점이 있습니다.The advantage of using the Properties is that you can write more generic code. 태스크에 대한 매우 구체적인 코드가 필요한 경우에는 태스크를 적절한 개체로 캐스팅해야 합니다.If you need very specific code for a task, then you should cast the task to its appropriate object.

다음 코드 예에서는 TaskHost가 들어 있는 BulkInsertTask인 thBulkInsertTask를 BulkInsertTask 개체로 캐스팅하는 방법을 보여 줍니다.The following code example shows how to cast a TaskHost, thBulkInsertTask, that contains a BulkInsertTask, to a BulkInsertTask object.

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

다음 코드 예에서는 실행 파일을 TaskHost로 캐스팅한 다음 InnerObject 속성을 사용하여 호스트에 의해 포함된 실행 파일의 유형을 확인하는 방법을 보여 줍니다.The following code example shows how to cast the executable to a TaskHost, and then use the InnerObject property to determine which type of executable is contained by the host.

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  

샘플 출력:Sample Output:

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

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

Add 문은 새로 만든 TaskHost 개체에서 Executable 개체로 캐스팅된 실행 파일을 반환합니다.The Add statement returns an executable that is cast to a TaskHost object from the newly created Executable object.

새 개체의 속성을 설정하거나 메서드를 호출하려면 다음 두 가지 방법을 사용합니다.To set properties or to call methods on the new object, you have two options:

  1. PropertiesTaskHost 컬렉션을 사용합니다.Use the Properties collection of the TaskHost. 예를 들어 개체의 속성을 가져오려면 th.Properties["propertyname"].GetValue(th))를 사용하고,For example, to obtain a property from the object, use th.Properties["propertyname"].GetValue(th)). 속성을 설정하려면 th.Properties["propertyname"].SetValue(th, <value>);를 사용합니다.To set a property, use th.Properties["propertyname"].SetValue(th, <value>);.

  2. InnerObjectTaskHost를 태스크 클래스로 캐스팅합니다.Cast the InnerObject of the TaskHost to the task class. 예를 들어 대량 삽입 태스크가 BulkInsertTask로 패키지에 추가된 후 이 태스크를 Executable로 캐스팅하고 이후에 TaskHost로 캐스팅하려면 BulkInsertTask myTask = th.InnerObject as BulkInsertTask;를 사용합니다.For example, to cast the Bulk Insert task to a BulkInsertTask after it has been added to a package as an Executable and subsequently cast to a TaskHost, use BulkInsertTask myTask = th.InnerObject as BulkInsertTask;.

    태스크별 클래스로 캐스팅하는 대신 코드에서 TaskHost 클래스를 사용하면 다음과 같은 장점이 있습니다.Using the TaskHost class in code, instead of casting to the task-specific class has the following advantages:

  • 코드에서 TaskHostProperties 공급자가 어셈블리를 참조할 필요가 없습니다.The TaskHostProperties provider does not require a reference to the assembly in the code.

  • 컴파일 시 태스크 이름을 몰라도 되므로 모든 태스크에 대해 작동하는 일반 루틴을 코딩할 수 있습니다.You can code generic routines that work for any task, because you do not have to know the name of the task at compile time. 이러한 일반 루틴에 포함된 메서드에서는 사용자가 해당 메서드에 태스크 이름을 전달하며 모든 메서드 코드가 모든 태스크에 대해 작동합니다.Such generic routines include methods where you pass in the name of the task to the method, and the method code works for all tasks. 따라서 이 메서드는 테스트 코드를 작성하는 데 유용합니다.This is a good method for writing test code.

    TaskHost에서 태스크별 클래스로 캐스팅하면 다음과 같은 장점이 있습니다.Casting from the TaskHost to the task-specific class has the following advantages:

  • Visual Studio 프로젝트에서 문 완성 기능(IntelliSense)을 제공합니다.The Visual Studio project gives you statement completion (IntelliSense).

  • 코드가 보다 빨리 실행될 수 있습니다.The code may run faster.

  • 태스크별 개체를 사용하면 초기 바인딩 및 결과 최적화 기능을 사용할 수 있습니다.Task-specific objects enable early binding and the resulting optimizations. 초기 바인딩과 런타임 바인딩에 대한 자세한 내용은 Visual Basic 언어 개념의 "초기 바인딩 및 런타임에 바인딩" 항목을 참조하십시오.For more information about early and late binding, see the topic "Early and Late Binding" in Visual Basic Language Concepts.

    다음 코드 예에서는 태스크 코드 재사용의 개념을 확장하여,The following code example expands on the concept of reusing task code. 태스크를 해당되는 특정 클래스로 캐스팅하는 대신 실행 파일을 TaskHost로 캐스팅한 다음 Properties를 사용하여 모든 태스크에 대한 일반 코드를 작성하는 방법을 보여 줍니다.Instead of casting tasks to their specific class equivalents, the code example shows how to cast the executable to a TaskHost, and then uses the Properties to write generic code against all the tasks.

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  

외부 리소스External Resources

blogs.msdn.com의 블로그 항목 - EzAPI – SQL Server 2012용으로 업데이트됨Blog entry, EzAPI – Updated for SQL Server 2012, on blogs.msdn.com.

관련 항목:See Also

프로그래밍 방식으로 태스크 연결Connecting Tasks Programmatically