Поделиться через


Вызов и определение событий в компоненте потока данных

Область применения: среда выполнения интеграции SSIS SQL Server в Фабрика данных Azure

Разработчики компонентов могут создавать подмножество событий, определенных в интерфейсе IDTSComponentEvents, вызывая методы, доступ к которым определяется свойством ComponentMetaData. Можно также определять пользовательские события, используя коллекцию EventInfos, и создавать эти события с помощью метода FireCustomEvent. В данном разделе описывается разработка и вызов событий, а также содержатся рекомендации по вызову событий во время разработки.

Вызов событий

Компоненты вызывают события с помощью методов Fire<X> интерфейса IDTSComponentMetaData100. События можно вызывать во время разработки и во время выполнения компонента. Обычно во время разработки методы FireError и FireWarning вызываются в процессе проверки компонента. Эти события выводят сообщения на панели Список ошибок среды SQL Server Data Tools (SSDT) и обеспечивают отзыв для пользователей компонента в случаях, когда он неправильно настроен.

Компоненты могут также вызывать события в любой момент во время выполнения. События позволяют разработчикам компонента предоставлять отзыв пользователям компонента в процессе его работы. Вызов метода FireError во время выполнения, скорее всего, приведет к аварийному завершению работы всего пакета.

Определение и вызов пользовательских событий

Разработка пользовательского события

Пользовательские события создаются с помощью метода Add коллекции EventInfos. Эта коллекция создается задачей потока данных и предоставляется разработчику компонента как свойство через базовый класс PipelineComponent. Этот класс содержит пользовательские события, определенные задачей потока данных, и пользовательские события, определенные компонентом с помощью вызова метода RegisterEvents.

Пользовательские события компонента не сохраняются в коде XML пакета. Поэтому метод RegisterEvents вызывается и во время разработки, и во время выполнения, чтобы компонент мог определить события, которые вызывает.

Параметр allowEventHandlers метода Add указывает, позволяет ли компонент создавать для этого события объекты DtsEventHandler. Следует заметить, что объекты DtsEventHandlers являются синхронными. Поэтому компонент не возобновляет выполнение, пока объект DtsEventHandler, принадлежащий пользовательскому событию, не закончил работу. Если параметр allowEventHandlers равен true, все параметры события автоматически доступны всем объектам DtsEventHandler через переменные, созданные и заполняемые автоматически службами SQL Server Integration Services во время выполнения.

Вызов пользовательского события

Компоненты вызывают пользовательские события с помощью метода FireCustomEvent, передавая ему имя, текст и параметры события. Если параметр allowEventHandlers равен true, все объекты DtsEventHandlers, созданные для пользовательского события, выполняются подсистемой выполнения служб SQL Server Integration Services.

Образец пользовательского события

Следующий пример кода демонстрирует компонент, который определяет пользовательское событие с помощью метода RegisterEvents, а затем вызывает это событие во время выполнения с помощью метода FireCustomEvent.

public override void RegisterEvents()  
{  
    string [] parameterNames = new string[2]{"RowCount", "StartTime"};  
    ushort [] parameterTypes = new ushort[2]{ DtsConvert.VarTypeFromTypeCode(TypeCode.Int32), DtsConvert.VarTypeFromTypeCode(TypeCode.DateTime)};  
    string [] parameterDescriptions = new string[2]{"The number of rows to sort.", "The start time of the Sort operation."};  
    EventInfos.Add("StartingSort","Fires when the component begins sorting the rows.",false,ref parameterNames, ref parameterTypes, ref parameterDescriptions);  
}  
public override void ProcessInput(int inputID, PipelineBuffer buffer)  
{  
    while (buffer.NextRow())  
    {  
       // Process buffer rows.  
    }  
  
    IDTSEventInfo100 eventInfo = EventInfos["StartingSort"];  
    object []arguments = new object[2]{buffer.RowCount, DateTime.Now };  
    ComponentMetaData.FireCustomEvent("StartingSort", "Beginning sort operation.", ref arguments, ComponentMetaData.Name, ref FireSortEventAgain);  
}  
Public  Overrides Sub RegisterEvents()   
  Dim parameterNames As String() = New String(2) {"RowCount", "StartTime"}   
  Dim parameterTypes As System.UInt16() = New System.UInt16(2) {DtsConvert.VarTypeFromTypeCode(TypeCode.Int32), DtsConvert.VarTypeFromTypeCode(TypeCode.DateTime)}   
  Dim parameterDescriptions As String() = New String(2) {"The number of rows to sort.", "The start time of the Sort operation."}   
  EventInfos.Add("StartingSort", "Fires when the component begins sorting the rows.", False, parameterNames, parameterTypes, parameterDescriptions)   
End Sub   
  
Public  Overrides Sub ProcessInput(ByVal inputID As Integer, ByVal buffer As PipelineBuffer)   
  While buffer.NextRow   
  End While   
  Dim eventInfo As IDTSEventInfo100 = EventInfos("StartingSort")   
  Dim arguments As Object() = New Object(2) {buffer.RowCount, DateTime.Now}   
  ComponentMetaData.FireCustomEvent("StartingSort", _  
    "Beginning sort operation.", arguments, _  
    ComponentMetaData.Name, FireSortEventAgain)   
End Sub  

См. также

Обработчики событий в службах Integration Services (SSIS)
Добавление обработчика событий к пакету