Hantera händelser programmatiskt
gäller för:SQL Server SSIS Integration Runtime i Azure Data Factory
SSIS-körningen innehåller en samling händelser som inträffar före, under och efter valideringen och körningen av ett paket. Dessa händelser kan fångas in på två sätt. Den första metoden är att implementera IDTSEvents-gränssnittet i en klass och ange klassen som en parameter till Execute and Validate methods of the package . Den andra metoden är att skapa DtsEventHandler objekt, som kan innehålla andra SSIS-objekt, till exempel uppgifter och loopar, som körs när en händelse i IDTSEvents inträffar. Det här avsnittet beskriver dessa två metoder och innehåller kodexempel som visar hur de används.
Ta emot IDTSEvents-återanrop
Utvecklare som skapar och kör paket programmatiskt kan ta emot händelsemeddelanden under validerings- och körningsprocessen med hjälp av IDTSEvents-gränssnittet. Detta görs genom att skapa en klass som implementerar
Klassen DefaultEvents är en klass som redan implementerar IDTSEvents-gränssnittet. Därför är ett annat alternativ till att implementera IDTSEvents direkt att härleda från DefaultEvents och åsidosätta de specifika händelser som du vill svara på. Sedan anger du klassen som en parameter för Verifiera och Kör metoder för Package för att ta emot händelseåteranrop.
Följande kodexempel visar en klass som härleds från DefaultEventsoch åsidosätter metoden OnPreExecute. Klassen tillhandahålls sedan som en parameter för
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
Skapa DtsEventHandler-objekt
Körningsmotorn ger ett robust, mycket flexibelt händelsehanterings- och meddelandesystem via DtsEventHandler-objektet. Med de här objekten kan du utforma hela arbetsflöden i händelsehanteraren, som endast körs när händelsen som händelsehanteraren tillhör inträffar. Det DtsEventHandler objektet är en container som körs när motsvarande händelse på det överordnade objektet utlöses. Med den här arkitekturen kan du skapa isolerade arbetsflöden som körs som svar på händelser som inträffar i en container. Eftersom DtsEventHandler objekt är synkrona återupptas inte körningen förrän händelsehanterarna som är kopplade till händelsen har återvänt.
Följande kod visar hur du skapar ett DtsEventHandler objekt. Koden lägger till en FileSystemTask i paketets Executables samling och skapar sedan ett DtsEventHandler objekt för aktivitetens OnError händelse. En FileSystemTask läggs till i händelsehanteraren, som körs när händelsen OnError inträffar för den första FileSystemTask. Det här exemplet förutsätter att du har en fil med namnet C:\Windows\Temp\DemoFile.txt för testning. Första gången du kör exemplet, om kopierar filen och händelsehanteraren inte anropas. Den andra gången du kör exemplet kan den första FileSystemTask inte kopiera filen (eftersom värdet för OverwriteDestinationFile är falskt), anropas händelsehanteraren, den andra FileSystemTask tar bort källfilen och paketrapporterna misslyckas på grund av felet som inträffade.
Exempel
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
Se även
händelsehanterare för Integration Services (SSIS)
Lägga till en händelsehanterare i ett paket