Gebeurtenissen programmatisch verwerken
van toepassing op:SQL Server
SSIS Integration Runtime in Azure Data Factory
De SSIS-runtime biedt een verzameling gebeurtenissen die plaatsvinden vóór, tijdens en na de validatie en uitvoering van een pakket. Deze gebeurtenissen kunnen op twee manieren worden vastgelegd. De eerste methode is door de IDTSEvents-interface in een klasse te implementeren en de klasse als parameter op te geven aan de uitvoeren en methoden van het pakket valideren. De tweede methode is het maken van DtsEventHandler objecten, die andere SSIS-objecten, zoals taken en lussen, kunnen bevatten die worden uitgevoerd wanneer een gebeurtenis in IDTSEvents plaatsvindt. In deze sectie worden deze twee methoden beschreven en worden codevoorbeelden weergegeven om het gebruik ervan te demonstreren.
Callbacks van IDTSEvents ontvangen
Ontwikkelaars die programmatisch pakketten bouwen en uitvoeren, kunnen gebeurtenismeldingen ontvangen tijdens het validatie- en uitvoeringsproces met behulp van de IDTSEvents-interface. Dit wordt gedaan door een klasse te maken die de IDTSEvents-interface implementeert en deze klasse als parameter opgeeft aan de Valideer en methoden van een pakket uitvoeren. De methoden van de klasse worden vervolgens aangeroepen door de runtime-engine wanneer de gebeurtenissen plaatsvinden.
De DefaultEvents-klasse is een klasse die de IDTSEvents-interface al implementeert; Daarom is een ander alternatief voor het rechtstreeks implementeren van IDTSEvents het afleiden van DefaultEvents en het overschrijven van de specifieke gebeurtenissen waarop u wilt reageren. Vervolgens geeft u uw klasse op als parameter aan de Valideer en methoden van de Package uitvoeren om callbacks voor gebeurtenissen te ontvangen.
In het volgende codevoorbeeld ziet u een klasse die is afgeleid van DefaultEventsen de methode OnPreExecute overschrijft. De klasse wordt vervolgens geleverd als een parameter voor de Validate en Execute methoden van het pakket.
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
DtsEventHandler-objecten maken
De runtime-engine biedt een robuust, zeer flexibel gebeurtenisafhandelings- en meldingssysteem via het DtsEventHandler-object. Met deze objecten kunt u hele werkstromen ontwerpen binnen de gebeurtenis-handler, die alleen worden uitgevoerd wanneer de gebeurtenis-handler deel uitmaakt van de gebeurtenis. Het DtsEventHandler-object is een container die wordt uitgevoerd wanneer de bijbehorende gebeurtenis op het bovenliggende object wordt geactiveerd. Met deze architectuur kunt u geïsoleerde werkstromen maken die worden uitgevoerd als reactie op gebeurtenissen die zich in een container voordoen. Omdat DtsEventHandler objecten synchroon zijn, wordt de uitvoering pas hervat als de gebeurtenis-handlers die aan de gebeurtenis zijn gekoppeld, zijn geretourneerd.
De volgende code laat zien hoe u een DtsEventHandler-object maakt. De code voegt een FileSystemTask toe aan de Executables verzameling van het pakket en maakt vervolgens een DtsEventHandler object voor de OnError gebeurtenis van de taak. Er wordt een FileSystemTask toegevoegd aan de gebeurtenis-handler, die wordt uitgevoerd wanneer de OnError gebeurtenis plaatsvindt voor de eerste FileSystemTask. In dit voorbeeld wordt ervan uitgegaan dat u een bestand hebt met de naam C:\Windows\Temp\DemoFile.txt voor testen. De eerste keer dat u het voorbeeld uitvoert, wordt het bestand niet aangeroepen als het bestand is gekopieerd en de gebeurtenis-handler niet wordt aangeroepen. De tweede keer dat u het voorbeeld uitvoert, kan het eerste FileSystemTask het bestand niet kopiëren (omdat de waarde van OverwriteDestinationFileonwaar is), wordt de gebeurtenis-handler aangeroepen, de tweede FileSystemTask het bronbestand verwijdert en het pakket rapporteert een fout vanwege de fout die is opgetreden.
Voorbeeld
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
Zie ook
SSIS-gebeurtenis-handlers (Integration Services)
een gebeurtenishandler toevoegen aan een pakket