프로그래밍 방식으로 이벤트 처리Handling Events Programmatically

SSISSSIS 런타임에서는 패키지의 유효성 검사 및 실행 전후와 도중에 발생하는 이벤트 컬렉션을 제공합니다.The SSISSSIS runtime provides a collection of events that occur before, during, and after the validation and execution of a package. 이러한 이벤트는 두 가지 방법으로 캡처할 수 있습니다.These events can be captured in two ways. 첫 번째 방법은 구현 하 여는 IDTSEvents 클래스에 인터페이스 및 클래스에 대 한 매개 변수로 제공 하는 Execute유효성 검사 패키지의 메서드.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. 두 번째 방법은 태스크 및 루프와 같이 다른 SSISSSIS 개체를 포함할 수 있으며 DtsEventHandler에서 이벤트가 발생할 때 실행되는 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. 이 섹션에서는 이러한 두 가지 방법에 대해 설명하고 각 사용 방법을 보여 주는 코드 예를 제공합니다.This section describes these two methods and provides code examples to demonstrate their use.

IDTSEvents 콜백 받기Receiving IDTSEvents Callbacks

프로그래밍 방식으로 패키지를 만들고 실행하는 개발자는 IDTSEvents 인터페이스를 사용하여 유효성 검사 및 실행 중에 이벤트 알림을 받을 수 있습니다.Developers who build and execute packages programmatically can receive event notifications during the validation and execution process using the IDTSEvents interface. 구현 하는 클래스를 만들어 이렇게는 IDTSEvents 인터페이스와이 클래스에 대 한 매개 변수로 제공 하는 유효성 검사Execute 패키지의 메서드.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. 그러면 이벤트가 발생할 때 런타임 엔진에 의해 해당 클래스의 메서드가 호출됩니다.The methods of the class are then called by the run-time engine when the events occur.

DefaultEvents 클래스는 IDTSEvents 인터페이스를 이미 구현하는 클래스이므로 IDTSEvents를 직접 구현하는 다른 방법은 DefaultEvents의 파생 클래스를 만들고 응답할 특정 이벤트를 재정의하는 것입니다.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. 매개 변수로 클래스를 제공 합니다는 유효성 검사Execute 의 메서드는 Package 이벤트 콜백을 받을 수 있습니다.You then provide your class as a parameter to the Validate and Execute methods of the Package to receive event callbacks.

다음 코드 예제에서는 DefaultEvents의 파생 클래스를 보여 주고 OnPreExecute 메서드를 재정의합니다.The following code sample demonstrates a class that derives from DefaultEvents, and overrides the OnPreExecute method. 그런 다음 클래스 되어에 aparameter로 제공 되는 유효성 검사Execute 패키지의 메서드.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  

DtsEventHandler 개체 만들기Creating DtsEventHandler Objects

런타임 엔진에서는 DtsEventHandler 개체를 통해 강력하고 매우 유연한 이벤트 처리 및 알림 시스템을 제공합니다.The run-time engine provides a robust, highly flexible event handling and notification system through the DtsEventHandler object. 이러한 개체를 사용하면 이벤트 처리기가 속해 있는 이벤트가 발생할 때만 실행되는 이벤트 처리기 내의 전체 워크플로를 디자인할 수 있습니다.These objects let you design whole workflows within the event handler, which execute only when the event that the event handler belongs to occurs. DtsEventHandler 개체는 상위 개체에 대해 해당 이벤트가 발생할 때 실행되는 컨테이너입니다.The DtsEventHandler object is a container that is executed when the corresponding event on its parent object fires. 이 아키텍처를 사용하면 컨테이너에서 발생하는 이벤트에 대한 응답으로 실행되는 격리된 워크플로를 만들 수 있습니다.This architecture lets you create isolated workflows that are executed in response to events that occur on a container. DtsEventHandler 개체는 동기적이므로 이벤트에 연결된 이벤트 처리기가 반환되기 전까지는 실행이 다시 시작되지 않습니다.Because DtsEventHandler objects are synchronous, execution does not resume until the event handlers that are attached to the event have returned.

다음 코드에서는 DtsEventHandler 개체를 만드는 방법을 보여 줍니다.The following code demonstrates how to create a DtsEventHandler object. 이 코드는 패키지의 FileSystemTask 컬렉션에 Executables를 추가한 다음 해당 태스크의 DtsEventHandler 이벤트에 대한 OnError 개체를 만듭니다.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. FileSystemTask는 첫 번째 OnError에 대해 FileSystemTask 이벤트가 발생할 때 실행되는 이벤트 처리기에 추가됩니다.A FileSystemTask is added to the event handler, which is executed when the OnError event occurs for the first FileSystemTask. 이 예에서는 C:\Windows\Temp\DemoFile.txt라는 테스트용 파일이 있다고 가정합니다.This example assumes that you have a file that is named C:\Windows\Temp\DemoFile.txt for testing. 이 샘플을 처음 실행할 때는 이 파일이 성공적으로 복사되므로 이벤트 처리기가 호출되지 않습니다.The first time that you run the sample, if copies the file successfully and the event handler is not called. 두 번째 샘플을 실행할 때 첫 번째 FileSystemTask 파일을 복사 하지 (때문에 값 OverwriteDestinationFilefalse), 이벤트 처리기가 호출 두 번째 FileSystemTask 발생 한 오류 때문에 소스 파일 및 패키지 보고서 오류를 삭제 합니다.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.

예제Example

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

Integration Services ( Ssis) 이벤트 처리기 Integration Services (SSIS) Event Handlers
패키지에 이벤트 처리기를 추가 합니다.Add an Event Handler to a Package