프로그래밍 방식으로 태스크 추가
적용 대상: 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되면 태스크에 추가 속성과 메서드를 사용할 수 있습니다. 또한 InnerObject의 TaskHost 속성을 통해 태스크 자체에 액세스할 수 있습니다. 필요에 따라 컬렉션을 통해 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 캐스팅되는 실행 파일을 반환합니다.
속성을 설정하거나 새 개체에서 메서드를 호출하려면 다음 두 가지 옵션이 있습니다.
의 Properties 컬렉션을 TaskHost사용합니다. 예를 들어 개체에서 속성을 가져오려면 .를 사용합니다
th.Properties["propertyname"].GetValue(th))
. 속성을 설정하려면 .를 사용합니다th.Properties["propertyname"].SetValue(th, <value>);
.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용으로 업데이트되었습니다.