Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
SSIS Integration Runtime em Azure Data Factory
As tarefas podem ser adicionadas aos seguintes tipos de objetos no motor de execução:
Estas classes são consideradas contentores e todas herdam a Executables propriedade. Os contentores podem conter uma coleção de tarefas, que são objetos executáveis processados pelo tempo de execução durante a execução do contentor. A ordem de execução dos objetos na coleção é determinada em qualquer PrecedenceConstraint conjunto em cada tarefa dos contentores. As restrições de precedência permitem a ramificação de execução com base no sucesso, falha ou conclusão de um Executable na coleção.
Cada contentor tem uma Executables coleção que contém os objetos individuais Executable . Cada tarefa executável herda e implementa o método e Validate o Execute método. Estes dois métodos são chamados pelo motor de tempo de execução para processar cada Executable.
Para adicionar uma tarefa a um pacote, precisas de um contentor com uma Executables coleção já existente. Na maioria das vezes, a tarefa que vais adicionar à coleção é um pacote. Para adicionar o novo executável de tarefa à coleção desse contentor, chama-se o Add método . O método tem um único parâmetro, uma string, que contém o nome CLSID, PROGID, stock ou CreationName da tarefa que está a adicionar.
Nomes das Tarefas
Embora possas especificar uma tarefa pelo nome ou pelo ID, o nome STOCK é o parâmetro mais usado no Add método. Para adicionar uma tarefa a um executável identificado pelo nome STOCK , use a seguinte sintaxe:
Executable exec = package.Executables.Add("STOCK:BulkInsertTask");
Dim exec As Executable = package.Executables.Add("STOCK:BulkInsertTask")
A lista seguinte mostra os nomes de cada tarefa usados após o nome STOCK .
ActiveXScriptTask
BulkInsertTask
ExecuteProcessTask
ExecutePackageTask
Exec80PackageTask
FileSystemTask
FTPTask
MSMQTask
PipelineTask
ScriptTask
SendMailTask
SQLTask
TransferStoredProceduresTask
TransferLoginsTask
TransferirErroMensagensTarefa
TransferJobsTask
TransferObjectsTask
TransferDatabaseTask
WebServiceTask
WmiDataReaderTask
WmiEventWatcherTarefa
XMLTask
Se preferir uma sintaxe mais explícita, ou se a tarefa que pretende adicionar não tiver o nome STOCK, pode adicionar a tarefa ao executável usando o seu nome longo. Esta sintaxe exige que também especifique o número de versão da tarefa.
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")
Pode obter o nome longo da tarefa programaticamente, sem precisar de especificar a versão da tarefa, usando a propriedade AssemblyQualifiedName da classe, como mostrado no exemplo seguinte. Este exemplo requer uma referência à Microsoft. Assembly 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)
O exemplo de código seguinte mostra como criar uma Executables coleção a partir de um novo pacote e depois adicionar uma tarefa de Sistema de Ficheiros e uma tarefa de Inserção em Massa à coleção, usando os seus nomes STOCK . Este exemplo requer uma referência à Microsoft. SqlServer.FileSystemTask e Microsoft. Assemblys de tarefas SqlServer.BulkInsert.
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
Amostra de saída:
Type Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask
Type Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask
Contentor TaskHost
A TaskHost classe é um contentor que não aparece na interface gráfica do utilizador, mas é muito importante na programação. Esta classe é um wrapper para cada tarefa. Tarefas que são adicionadas ao pacote usando o Add método como Executable objeto podem ser lançadas como objeto TaskHost . Quando uma tarefa é castada como TaskHost, pode usar propriedades e métodos adicionais na tarefa. Além disso, a própria tarefa pode ser acedida através da InnerObject propriedade do TaskHost. Dependendo das suas necessidades, pode decidir manter a tarefa como um TaskHost objeto para poder usar as propriedades da tarefa através da Properties coleção. A vantagem de usar o Properties é que podes escrever código mais genérico. Se precisar de código muito específico para uma tarefa, então deve lançar a tarefa para o objeto apropriado.
O seguinte exemplo de código mostra como lançar um TaskHost, thBulkInsertTask, que contém um BulkInsertTask, para um BulkInsertTask objeto.
BulkInsertTask myTask = thBulkInsertTask.InnerObject as BulkInsertTask;
Dim myTask As BulkInsertTask = CType(thBulkInsertTask.InnerObject, BulkInsertTask)
O exemplo de código seguinte mostra como projetar o executável para um TaskHost, e depois usar a InnerObject propriedade para determinar que tipo de executável está contido pelo 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
Amostra de saída:
Found task of type Microsoft.SqlServer.Dts.Tasks.FileSystemTask.FileSystemTask
Found task of type Microsoft.SqlServer.Dts.Tasks.BulkInsertTask.BulkInsertTask
A Add instrução devolve um executável que é lançado para um TaskHost objeto a partir do objeto recém-criado Executable .
Para definir propriedades ou chamar métodos no novo objeto, tens duas opções:
Use a Properties coleção dos TaskHost. Por exemplo, para obter uma propriedade do objeto, use
th.Properties["propertyname"].GetValue(th)). Para definir uma propriedade, useth.Properties["propertyname"].SetValue(th, <value>);.Lança o InnerObject do TaskHost para a classe de tarefa. Por exemplo, para castar a tarefa Bulk Insert para a BulkInsertTask depois de ter sido adicionada a um pacote como um Executable e posteriormente cast para um TaskHost, use
BulkInsertTask myTask = th.InnerObject as BulkInsertTask;.
Usar a TaskHost classe em código, em vez de castar para a classe específica da tarefa, tem as seguintes vantagens:
O TaskHostProperties fornecedor não requer referência ao assembly no código.
Podes programar rotinas genéricas que funcionam para qualquer tarefa, porque não precisas de saber o nome da tarefa em tempo de compilação. Estas rotinas genéricas incluem métodos em que se passa o nome da tarefa para o método, e o código do método funciona para todas as tarefas. Este é um bom método para escrever código de teste.
Lançar do TaskHost para a classe específica da tarefa tem as seguintes vantagens:
O projeto Visual Studio dá-te completude instruções (IntelliSense).
O código pode correr mais rápido.
Objetos específicos da tarefa permitem ligações precoces e as otimizações resultantes. Para mais informações sobre encadernação inicial e tardia, consulte o tópico "Encadernação Inicial e Tardia" em Visual Basic Language Concepts.
O seguinte exemplo de código expande o conceito de reutilização de código de tarefa. Em vez de lançar tarefas para as suas classes equivalentes específicas, o exemplo de código mostra como lançar o executável para um TaskHost, e depois usa o Properties para escrever código genérico em todas as tarefas.
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