データ フロー コンポーネントのイベントの発生と定義
コンポーネント開発者は、ComponentMetaData プロパティで公開されているメソッドを呼び出して、IDTSComponentEvents インターフェイスで定義されているイベントのサブセットを発生させることができます。 また、EventInfos コレクションを使用してカスタム イベントを定義し、FireCustomEvent メソッドを使用して、実行時にこのイベントを発生させることもできます。 このセクションでは、イベントを作成、発生させる方法について説明し、デザイン時にイベントを発生させるタイミングに関するガイドラインを示します。
イベントの発生
コンポーネントは、IDTSComponentMetaData100 インターフェイスの Fire<X> メソッドを使用して、イベントを発生させます。 イベントは、コンポーネントのデザイン時および実行時のどちらでも発生させることができます。 通常、コンポーネントのデザイン時には、検証中に FireError メソッドや FireWarning メソッドが呼び出されます。 これらのイベントは、コンポーネントが正しく構成されていない場合、SQL Server データ ツール (SSDT) の [エラー一覧] ペインにメッセージを表示し、ユーザーにフィードバックを返します。
コンポーネントは、実行時の任意のタイミングでもイベントを発生させることができます。 イベントを使用すると、コンポーネント開発者はユーザーに対して、コンポーネントの実行に伴うフィードバックを返すことができます。 実行時に FireError メソッドが呼び出された場合、パッケージが失敗したと考えられます。
カスタム イベントの定義と発生
カスタム イベントの定義
カスタム イベントを作成するには、EventInfos コレクションの Add メソッドを呼び出します。 このコレクションはデータ フロー タスクによって設定され、コンポーネント開発者には、基本クラス PipelineComponent を介したプロパティとして提供されます。 このクラスには、データ フロー タスクによって定義されたカスタム イベントと、RegisterEvents メソッド内でコンポーネントによって定義されたカスタム イベントが含まれています。
コンポーネントのカスタム イベントは、パッケージ XML には保存されません。 したがって、コンポーネントのデザイン時および実行時の両方で RegisterEvents メソッドが呼び出され、発生するイベントが定義されます。
Add メソッドのパラメーター allowEventHandlers は、コンポーネントがイベント用に DtsEventHandler オブジェクトを作成するかどうかを指定します。 DtsEventHandlers は同期型であることに注意してください。 このため、カスタム イベントにアタッチされた DtsEventHandler の実行が終了するまで、コンポーネントは実行を再開しません。 allowEventHandlers パラメーターが true の場合、すべての DtsEventHandler オブジェクトは、SQL Server Integration Services ランタイムが自動的に作成し、値を設定した変数を介して、自動的にイベントの各パラメーターを使用できるようになります。
カスタム イベントの発生
コンポーネントは、FireCustomEvent メソッドを呼び出し、イベントの名前、テキスト、パラメーターを渡して、カスタム イベントを発生させます。 allowEventHandlers パラメーターが true の場合、カスタム イベント用に作成されたすべての DtsEventHandlers は、SSIS ランタイム エンジンによって実行されます。
カスタム イベントのサンプル
次のコード例では、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 paramterTypes, 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, paramterTypes, 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
|