Gestione degli eventi a livello di programmazioneHandling Events Programmatically

Il runtime di SSISSSIS fornisce una raccolta di eventi che si verificano prima, durante e dopo la convalida e l'esecuzione di un pacchetto.The SSISSSIS runtime provides a collection of events that occur before, during, and after the validation and execution of a package. Tali eventi possono essere acquisiti in due modi.These events can be captured in two ways. Il primo metodo è implementando il IDTSEvents di interfaccia in una classe e fornisce la classe come parametro per il Execute e convalida metodi del pacchetto.The first method is by implementing the IDTSEvents interface in a class, and supplying the class as a parameter to the Execute and Validate methods of the package. Il secondo metodo consiste nella creazione di oggetti DtsEventHandler che possono contenere altri oggetti di SSISSSIS, ad esempio attività e cicli, eseguiti quando si verifica un evento in IDTSEvents.The second method is by creating DtsEventHandler objects, which can contain other SSISSSIS objects, such as tasks and loops, that are executed when an event in IDTSEvents occurs. In questa sezione vengono descritti questi due metodi e vengono forniti esempi di codice per dimostrarne l'utilizzo.This section describes these two methods and provides code examples to demonstrate their use.

Ricezione di callback IDTSEventsReceiving IDTSEvents Callbacks

Gli sviluppatori che compilano ed eseguono pacchetti a livello di programmazione possono ricevere notifiche di eventi durante il processo di convalida ed esecuzione tramite l'interfaccia IDTSEvents.Developers who build and execute packages programmatically can receive event notifications during the validation and execution process using the IDTSEvents interface. Questa operazione viene eseguita tramite la creazione di una classe che implementa il IDTSEvents interfaccia e specificare tale classe come parametro per il convalida e Execute metodi di un pacchetto.This is done by creating a class that implements the IDTSEvents interface and providing this class as a parameter to the Validate and Execute methods of a package. I metodi della classe vengono quindi chiamati dal motore di run-time quando si verificano gli eventi.The methods of the class are then called by the run-time engine when the events occur.

La classe DefaultEvents è una classe che implementa già l'interfaccia IDTSEvents; pertanto, un'alternativa all'implementazione diretta di IDTSEvents consiste nel derivare da DefaultEvents ed eseguire l'override degli eventi specifici ai quali si desidera rispondere.The DefaultEvents class is a class that already implements the IDTSEvents interface; therefore, another alternative to implementing IDTSEvents directly is to derive from DefaultEvents and override the specific events that you want to respond to. Specificare quindi la classe come parametro per il convalida e Execute metodi del Package per ricevere i callback di evento.You then provide your class as a parameter to the Validate and Execute methods of the Package to receive event callbacks.

Nell'esempio di codice seguente viene illustrata una classe che deriva da DefaultEvents ed esegue l'override del metodo OnPreExecute.The following code sample demonstrates a class that derives from DefaultEvents, and overrides the OnPreExecute method. La classe viene quindi fornita come aparameter per il convalida e Execute metodi del pacchetto.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  

Creazione di oggetti DtsEventHandlerCreating DtsEventHandler Objects

Il motore di run-time fornisce un sistema di gestione e notifica degli eventi stabile e ampiamente flessibile tramite l'oggetto DtsEventHandler.The run-time engine provides a robust, highly flexible event handling and notification system through the DtsEventHandler object. Questi oggetti consentono di progettare interi flussi di lavoro dall'interno del gestore eventi, che vengono eseguiti solo quando si verifica l'evento cui appartiene il gestore.These objects let you design whole workflows within the event handler, which execute only when the event that the event handler belongs to occurs. L'oggetto DtsEventHandler è un contenitore eseguito quando viene generato l'evento corrispondente nel relativo oggetto padre.The DtsEventHandler object is a container that is executed when the corresponding event on its parent object fires. Questa architettura consente di creare flussi di lavoro isolati eseguiti in risposta a eventi che si verificano in un contenitore.This architecture lets you create isolated workflows that are executed in response to events that occur on a container. Poiché gli oggetti DtsEventHandler sono sincroni, l'esecuzione riprende solo dopo che sono stati restituiti i gestori eventi collegati all'evento.Because DtsEventHandler objects are synchronous, execution does not resume until the event handlers that are attached to the event have returned.

Nell'esempio di codice seguente viene illustrato come creare un oggetto DtsEventHandler.The following code demonstrates how to create a DtsEventHandler object. Nel codice viene aggiunto FileSystemTask alla raccolta Executables del pacchetto, quindi viene creato un oggetto DtsEventHandler per l'evento OnError dell'attività.The code adds a FileSystemTask to the Executables collection of the package, and then creates a DtsEventHandler object for the OnError event of the task. Un oggetto FileSystemTask viene aggiunto al gestore eventi, che viene eseguito quando si verifica l'evento OnError per il primo oggetto FileSystemTask.A FileSystemTask is added to the event handler, which is executed when the OnError event occurs for the first FileSystemTask. In questo esempio si presuppone che si disponga di un file denominato C:\Windows\Temp\DemoFile.txt per il test.This example assumes that you have a file that is named C:\Windows\Temp\DemoFile.txt for testing. La prima volta che si esegue l'esempio, il file viene copiato correttamente e il gestore eventi non viene chiamato.The first time that you run the sample, if copies the file successfully and the event handler is not called. La seconda volta che si esegue l'esempio, il primo FileSystemTask non riesce a copiare il file (perché il valore di OverwriteDestinationFile è false), viene chiamato il gestore dell'evento, il secondo FileSystemTask Elimina il file di origine e il pacchetto segnala un problema a causa dell'errore che si sono verificati.The second time you run the sample, the first FileSystemTask fails to copy the file (because the value of OverwriteDestinationFile is false), the event handler is called, the second FileSystemTask deletes the source file, and the package reports failure because of the error that occurred.

EsempioExample

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  

Vedere ancheSee Also

Integration Services ( SSIS ) Gestori eventi Integration Services (SSIS) Event Handlers
Aggiungere un gestore eventi a un pacchettoAdd an Event Handler to a Package