Obsługa zdarzenia programowe
The SSIS runtime provides a kolekcja of events that occur before, during, and after the validation and execution of a pakiet. Zdarzenia te mogą być przechwytywane na dwa sposoby.Pierwsza metoda polega na realizacji IDTSEvents Interfejs w klasie i dostarczanie klasę jako parametr Execute i Validate metody pakiet. Druga metoda polega na tworzenie DtsEventHandler obiekty, które mogą zawierać inne SSIS obiekty, takie jak zadania i pętli, które są wykonywane, gdy zdarzenie IDTSEvents występuje. W tej sekcji opisano te dwie metody oraz przykłady kodu do wykazania, ich zastosowania.
Odbieranie wywołania zwrotne IDTSEvents
Deweloperzy, którzy budowanie i programowo wykonać pakietów może odbierać zdarzenie powiadomienia podczas sprawdzania poprawności i wykonać procesu przy użyciu IDTSEvents interfejs. Można to zrobić, tworząc klasę, która implementuje IDTSEvents interfejs i dostarczenie tej klasy jako parametr Validate i Execute metody pakiet. Metody klasy są następnie wywoływane przez uruchomienie-czas silnika po wystąpieniu zdarzenia.
The DefaultEvents class is a class that already implements the IDTSEvents interfejs; therefore, another alternative to implementing IDTSEvents directly is to derive from DefaultEvents and override the specific events that you want to respond to. Następnie podaj klasy jako parametr Validate i Execute metody Package Aby odbierać zdarzenie wywołania zwrotne.
Poniższy przykład kodu demonstruje klasy, która wynika z DefaultEventsi zastępuje OnPreExecute(Executable, Boolean%) Metoda. The class is then provided as aparameter to the Validate and Execute methods of the package.
using System;
using Microsoft.SqlServer.Dts.Runtime;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
Package p = new Package();
MyEventsClass eventsClass = new MyEventsClass();
p.Validate(null, null, eventsClass, null);
p.Execute(null, null, eventsClass, null, null);
Console.Read();
}
}
class MyEventsClass : DefaultEvents
{
public override void OnPreExecute(Executable exec, ref bool fireAgain)
{
// TODO: Add custom code to handle the event.
Console.WriteLine("The PreExecute event of the " +
exec.ToString() + " has been raised.");
}
}
}
Imports Microsoft.SqlServer.Dts.Runtime
Module Module1
Sub Main()
Dim p As Package = New Package()
Dim eventsClass As MyEventsClass = New MyEventsClass()
p.Validate(Nothing, Nothing, eventsClass, Nothing)
p.Execute(Nothing, Nothing, eventsClass, Nothing, Nothing)
Console.Read()
End Sub
End Module
Class MyEventsClass
Inherits DefaultEvents
Public Overrides Sub OnPreExecute(ByVal exec As Executable, ByRef fireAgain As Boolean)
' TODO: Add custom code to handle the event.
Console.WriteLine("The PreExecute event of the " & _
exec.ToString() & " has been raised.")
End Sub
End Class
Tworzenie obiektów DtsEventHandler
Uruchom-czas aparat zapewnia niezawodne, bardzo elastyczne zdarzeń system obsługi i powiadomienie za pośrednictwem DtsEventHandler obiekt. Obiekty te pozwalają projektować całego przepływy pracy w ramach obsługa zdarzeń, które wykonywać tylko wtedy, gdy wystąpi zdarzenie należącej do obsługa zdarzeń.The DtsEventHandler object is a kontener that is executed when the corresponding zdarzenie on its parent object fires. Ta architektura umożliwia tworzenie izolowane przepływy pracy, które są wykonywane w odpowiedzi na zdarzenia występujące w kontenerze.Ponieważ DtsEventHandler obiekty są synchroniczne, wykonanie nie wznawia aż do chwili, kiedy obsługi zdarzeń, które są dołączone do zdarzenie zostały zwrócone.
Poniższy kod demonstruje sposób tworzenia DtsEventHandler obiekt. Dodaje kod FileSystemTask Aby Executables() Kolekcja pakiet, a następnie tworzy DtsEventHandler obiekt o OnError(DtsObject, Int32, String, String, String, Int32, String) zdarzenie tego zadania. A FileSystemTask zostanie dodany do programu obsługa zdarzeń, który jest wykonywany, kiedy OnError(DtsObject, Int32, String, String, String, Int32, String) w pierwszym wystąpieniu zdarzenie FileSystemTask. W tym przykładzie założono, że istnieje plik o nazwie C:\Windows\Temp\DemoFile.txt do testowania.Pierwszy czas uruchomić próbki, jeśli kopiuje plik pomyślnie i obsługa zdarzeń nie jest wywoływana.Po raz drugi uruchomić próbki, pierwszy FileSystemTask Nie można skopiować pliku (ponieważ wartość OverwriteDestinationFile() jest false), obsługa zdarzeń jest nazywany, drugi FileSystemTask Usuwa plik źródłowy i niepowodzeń raportów pakiet z powodu błędu, który wystąpił.
Przykład
using System;
using System.IO;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Tasks.FileSystemTask;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
string f = "DemoFile.txt";
Executable e;
TaskHost th;
FileSystemTask fst;
Package p = new Package();
p.Variables.Add("sourceFile", true, String.Empty,
@"C:\Windows\Temp\" + f);
p.Variables.Add("destinationFile", true, String.Empty,
Path.Combine(Directory.GetCurrentDirectory(), f));
// Create a first File System task and add it to the package.
// This task tries to copy a file from one folder to another.
e = p.Executables.Add("STOCK:FileSystemTask");
th = e as TaskHost;
th.Name = "FileSystemTask1";
fst = th.InnerObject as FileSystemTask;
fst.Operation = DTSFileSystemOperation.CopyFile;
fst.OverwriteDestinationFile = false;
fst.Source = "sourceFile";
fst.IsSourcePathVariable = true;
fst.Destination = "destinationFile";
fst.IsDestinationPathVariable = true;
// Add an event handler for the FileSystemTask's OnError event.
DtsEventHandler ehOnError = (DtsEventHandler)th.EventHandlers.Add("OnError");
// Create a second File System task and add it to the event handler.
// This task deletes the source file if the event handler is called.
e = ehOnError.Executables.Add("STOCK:FileSystemTask");
th = e as TaskHost;
th.Name = "FileSystemTask2";
fst = th.InnerObject as FileSystemTask;
fst.Operation = DTSFileSystemOperation.DeleteFile;
fst.Source = "sourceFile";
fst.IsSourcePathVariable = true;
DTSExecResult vr = p.Validate(null, null, null, null);
Console.WriteLine("ValidationResult = " + vr.ToString());
if (vr == DTSExecResult.Success)
{
DTSExecResult er = p.Execute(null, null, null, null, null);
Console.WriteLine("ExecutionResult = " + er.ToString());
if (er == DTSExecResult.Failure)
if (!File.Exists(@"C:\Windows\Temp\" + f))
Console.WriteLine("Source file has been deleted by the event handler.");
}
Console.Read();
}
}
}
Imports System.IO
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Tasks.FileSystemTask
Module Module1
Sub Main()
Dim f As String = "DemoFile.txt"
Dim e As Executable
Dim th As TaskHost
Dim fst As FileSystemTask
Dim p As Package = New Package()
p.Variables.Add("sourceFile", True, String.Empty, _
"C:\Windows\Temp\" & f)
p.Variables.Add("destinationFile", True, String.Empty, _
Path.Combine(Directory.GetCurrentDirectory(), f))
' Create a first File System task and add it to the package.
' This task tries to copy a file from one folder to another.
e = p.Executables.Add("STOCK:FileSystemTask")
th = CType(e, TaskHost)
th.Name = "FileSystemTask1"
fst = CType(th.InnerObject, FileSystemTask)
fst.Operation = DTSFileSystemOperation.CopyFile
fst.OverwriteDestinationFile = False
fst.Source = "sourceFile"
fst.IsSourcePathVariable = True
fst.Destination = "destinationFile"
fst.IsDestinationPathVariable = True
' Add an event handler for the FileSystemTask's OnError event.
Dim ehOnError As DtsEventHandler = CType(th.EventHandlers.Add("OnError"), DtsEventHandler)
' Create a second File System task and add it to the event handler.
' This task deletes the source file if the event handler is called.
e = ehOnError.Executables.Add("STOCK:FileSystemTask")
th = CType(e, TaskHost)
th.Name = "FileSystemTask1"
fst = CType(th.InnerObject, FileSystemTask)
fst.Operation = DTSFileSystemOperation.DeleteFile
fst.Source = "sourceFile"
fst.IsSourcePathVariable = True
Dim vr As DTSExecResult = p.Validate(Nothing, Nothing, Nothing, Nothing)
Console.WriteLine("ValidationResult = " + vr.ToString())
If vr = DTSExecResult.Success Then
Dim er As DTSExecResult = p.Execute(Nothing, Nothing, Nothing, Nothing, Nothing)
Console.WriteLine("ExecutionResult = " + er.ToString())
If er = DTSExecResult.Failure Then
If Not File.Exists("C:\Windows\Temp\" + f) Then
Console.WriteLine("Source file has been deleted by the event handler.")
End If
End If
End If
Console.Read()
End Sub
End Module
|
See Also