Menambahkan Tugas Secara Terprogram
Berlaku untuk: SQL Server
SSIS Integration Runtime di Azure Data Factory
Tugas dapat ditambahkan ke jenis objek berikut di mesin run-time:
Kelas-kelas ini dianggap sebagai kontainer, dan semuanya mewarisi Executables properti . Kontainer dapat berisi kumpulan tugas, yang merupakan objek yang dapat dieksekusi yang diproses oleh runtime selama eksekusi kontainer. Urutan eksekusi objek dalam koleksi ditentukan set apa pun PrecedenceConstraint pada setiap tugas dalam kontainer. Batasan prioritas memungkinkan percabangan eksekusi berdasarkan keberhasilan, kegagalan, atau penyelesaian Executable dalam koleksi.
Setiap kontainer memiliki Executables koleksi yang berisi objek individual Executable . Setiap tugas yang dapat dieksekusi mewarisi dan mengimplementasikan Execute metode dan Validate metode . Kedua metode ini dipanggil oleh mesin run-time untuk memproses masing-masing Executable.
Untuk menambahkan tugas ke paket, Anda memerlukan kontainer dengan koleksi yang Executables sudah ada. Sebagian besar waktu, tugas yang akan Anda tambahkan ke koleksi adalah paket. Untuk menambahkan tugas baru yang dapat dieksekusi ke dalam koleksi untuk kontainer tersebut Add , Anda memanggil metode . Metode ini memiliki parameter tunggal, string, yang berisi CLSID, PROGID, STOCK moniker, atau CreationName tugas yang Anda tambahkan.
Nama Tugas
Meskipun Anda dapat menentukan tugas berdasarkan nama atau berdasarkan ID, moniker STOCK adalah parameter yang paling sering digunakan dalam Add metode . Untuk menambahkan tugas ke executable yang diidentifikasi oleh moniker STOCK , gunakan sintaks berikut:
Executable exec = package.Executables.Add("STOCK:BulkInsertTask");
Dim exec As Executable = package.Executables.Add("STOCK:BulkInsertTask")
Daftar berikut ini memperlihatkan nama untuk setiap tugas yang digunakan setelah moniker STOCK .
ActiveXScriptTask
BulkInsertTask
ExecuteProcessTask
ExecutePackageTask
Exec80PackageTask
FileSystemTask
FTPTask
MSMQTask
PipelineTask
ScriptTask
SendMailTask
SQLTask
TransferStoredProceduresTask
TransferLoginsTask
TransferErrorMessagesTask
TransferJobsTask
TransferObjectsTask
TransferDatabaseTask
WebServiceTask
WmiDataReaderTask
WmiEventWatcherTask
XmlTask
Jika Anda lebih suka sintaksis yang lebih eksplisit, atau jika tugas yang ingin Anda tambahkan tidak memiliki moniker STOCK, Anda dapat menambahkan tugas ke yang dapat dieksekusi menggunakan nama panjangnya. Sintaks ini mengharuskan Anda juga menentukan nomor versi tugas.
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")
Anda bisa mendapatkan nama panjang untuk tugas secara terprogram, tanpa harus menentukan versi tugas, dengan menggunakan properti AssemblyQualifiedName kelas, seperti yang ditunjukkan dalam contoh berikut. Contoh ini memerlukan referensi ke rakitan 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)
Contoh kode berikut menunjukkan cara membuat Executables koleksi dari paket baru, lalu menambahkan tugas Sistem File dan tugas Sisipkan Massal ke koleksi, dengan menggunakan moniker STOCK mereka. Contoh ini memerlukan referensi ke rakitan Microsoft.SqlServer.FileSystemTask dan 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
Contoh Output:
Type Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask
Type Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask
Kontainer TaskHost
Kelas TaskHost adalah kontainer yang tidak muncul di antarmuka pengguna grafis, tetapi sangat penting dalam pemrograman. Kelas ini adalah pembungkus untuk setiap tugas. Tugas yang ditambahkan ke paket dengan menggunakan Add metode sebagai Executable objek dapat dilemparkan sebagai TaskHost objek. Saat tugas dilemparkan sebagai TaskHost, Anda dapat menggunakan properti dan metode tambahan pada tugas. Selain itu, tugas itu sendiri dapat diakses melalui InnerObject properti dari TaskHost. Bergantung pada kebutuhan Anda, Anda dapat memutuskan untuk menyimpan tugas sebagai TaskHost objek sehingga Anda dapat menggunakan properti tugas melalui Properties koleksi. Keuntungan menggunakannya Properties adalah Anda dapat menulis kode yang lebih umum. Jika Anda memerlukan kode yang sangat spesifik untuk tugas, maka Anda harus melemparkan tugas ke objek yang sesuai.
Contoh kode berikut menunjukkan cara melemparkan TaskHost, thBulkInsertTask, yang berisi BulkInsertTask, ke BulkInsertTask objek.
BulkInsertTask myTask = thBulkInsertTask.InnerObject as BulkInsertTask;
Dim myTask As BulkInsertTask = CType(thBulkInsertTask.InnerObject, BulkInsertTask)
Contoh kode berikut menunjukkan cara mentransmisikan executable ke TaskHost, lalu menggunakan InnerObject properti untuk menentukan jenis executable mana yang dimuat oleh 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
Contoh Output:
Found task of type Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask
Found task of type Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask
Pernyataan Add mengembalikan executable yang ditransmisikan ke TaskHost objek dari objek yang baru dibuat Executable .
Untuk mengatur properti atau memanggil metode pada objek baru, Anda memiliki dua opsi:
Properties Gunakan koleksi TaskHost. Misalnya, untuk mendapatkan properti dari objek, gunakan
th.Properties["propertyname"].GetValue(th))
. Untuk mengatur properti, gunakanth.Properties["propertyname"].SetValue(th, <value>);
.InnerObject Cast dari TaskHost ke kelas tugas. Misalnya, untuk mentransmisikan tugas Sisipkan Massal ke BulkInsertTask setelah ditambahkan ke paket sebagai Executable dan kemudian ditransmisikan ke TaskHost, gunakan
BulkInsertTask myTask = th.InnerObject as BulkInsertTask;
.
TaskHost Menggunakan kelas dalam kode, alih-alih transmisi ke kelas khusus tugas memiliki keuntungan berikut:
Penyedia TaskHostProperties tidak memerlukan referensi ke rakitan dalam kode.
Anda dapat membuat kode rutinitas generik yang berfungsi untuk tugas apa pun, karena Anda tidak perlu mengetahui nama tugas pada waktu kompilasi. Rutinitas generik tersebut mencakup metode di mana Anda meneruskan nama tugas ke metode , dan kode metode berfungsi untuk semua tugas. Ini adalah metode yang baik untuk menulis kode uji.
Transmisi dari ke TaskHost kelas khusus tugas memiliki keuntungan berikut:
Proyek Visual Studio memberi Anda penyelesaian pernyataan (IntelliSense).
Kode mungkin berjalan lebih cepat.
Objek khusus tugas memungkinkan pengikatan awal dan pengoptimalan yang dihasilkan. Untuk informasi selengkapnya tentang pengikatan awal dan terlambat, lihat topik "Pengikatan Awal dan Terlambat" dalam Konsep Bahasa Visual Basic.
Contoh kode berikut meluas pada konsep penggunaan kembali kode tugas. Alih-alih mentransmisikan tugas ke kelas spesifik yang setara, contoh kode menunjukkan cara mentransmisikan yang dapat dieksekusi ke TaskHost, lalu menggunakan Properties untuk menulis kode generik terhadap semua tugas.
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
Sumber Daya Eksternal
Entri blog, EzAPI - Diperbarui untuk SQL Server 2012, pada blogs.msdn.com.