以程式設計方式加入工作
適用於:Azure Data Factory 中的 SQL Server SSIS Integration Runtime
在執行階段引擎中可以將工作加入下列類型的物件:
這些類別都視為容器,而且它們全部都繼承 Executables 屬性。 容器可以包含工作集合,這些工作是容器執行期間執行階段所處理的可執行物件。 在集合中的物件執行順序是由容器中每個工作上所設定的任何 PrecedenceConstraint 來決定。 優先順序條件約束允許根據集合中的 Executable 之成功、失敗或是完成來執行分支。
每個容器都有 Executables 集合,它包含個別的 Executable 物件。 每個可執行的工作都會繼承和實作 Execute 方法和 Validate 方法。 這兩種方法都是由執行階段引擎來呼叫以處理每個 Executable。
若要將工作加入封裝,您需要具有 Executables 現有集合的容器。 大部分的情況下,您將加入集合的工作是封裝。 若要將新工作可執行檔加入容器的集合,可呼叫 Add 方法。 該方法有單一參數和一個字串,包含 CLSID、PROGID、STOCK Moniker 或是您正在加入的工作之 CreationName。
工作名稱
雖然您可以依名稱或是識別碼指定工作,STOCK Moniker 是在 Add 方法中最常使用的參數。 若要將工作加入 STOCK Moniker 識別的可執行檔,請使用下列語法:
Executable exec = package.Executables.Add("STOCK:BulkInsertTask");
Dim exec As Executable = package.Executables.Add("STOCK:BulkInsertTask")
下列清單顯示在 STOCK Moniker 後面所使用的每個工作名稱。
ActiveXScriptTask
BulkInsertTask
ExecuteProcessTask
ExecutePackageTask
Exec80PackageTask
FileSystemTask
FTPTask
MSMQTask
PipelineTask
ScriptTask
SendMailTask
SQLTask
TransferStoredProceduresTask
TransferLoginsTask
TransferErrorMessagesTask
TransferJobsTask
TransferObjectsTask
TransferDatabaseTask
WebServiceTask
WmiDataReaderTask
WmiEventWatcherTask
XMLTask
如果您喜歡較明確的語法,或是如果您想要加入的工作沒有 STOCK Moniker,可以使用其完整名稱將工作加入可執行檔。 這個語法需要您也指定工作的版本號碼。
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 Moniker,將檔案系統工作和大量插入工作加入集合。 這個範例需要 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 屬性來存取。 視您的需求而定,可以決定將工作保留為 TaskHost 物件,如此便可透過 Properties 集合使用工作的屬性。 使用 Properties 的優點是您可以撰寫更一般的程式碼。 如果您對於工作需要非常特定的程式碼,則應該將工作轉換為其適當的物件。
下列程式碼範例顯示如何將 TaskHost 和 thBulkInsertTask (包含 BulkInsertTask) 轉換為 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 物件的可執行檔。
若要在新物件上設定屬性或是呼叫方法,您有兩個選項:
使用 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 語言概念>中的<早期和晚期繫結>主題。
下列程式碼範例擴充了重複使用工作程式碼的概念。 程式碼範例並不是將工作轉換為其特定的類別對等項目,而是將可執行檔轉換為 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 更新)。