複数のイベント ハンドラーの連携方法

Visual Basic でプログラミングしている場合を除き、すべてのイベントを実際に処理するかどうかに関係なく、Connection および Recordset イベントのすべてのイベント ハンドラーを実装する必要があります。 実行する必要がある実装作業の量は、プログラミング言語によって異なります。 詳細については、言語による ADO イベントのインスタンス化に関するページを参照してください。

ペアのイベント ハンドラー

各 Will イベント ハンドラーには、Complete イベント ハンドラーが関連付けられています。 たとえば、アプリケーションでフィールドの値が変更されると、WillChangeField イベント ハンドラーが呼び出されます。 変更が許容される場合、アプリケーションでは adStatus パラメーターを変更せずに、操作が実行されます。 操作が完了すると、FieldChangeComplete イベントから、操作が完了したことがアプリケーションに通知されます。 正常に完了した場合、adStatus には adStatusOK が含まれます。それ以外の場合、adStatus には adStatusErrorsOccurred が含まれ、Error オブジェクトを確認してエラーの原因を特定する必要があります。

WillChangeField が呼び出されると、変更を行うべきではないと判断するかもしれません。 その場合は、adStatusadStatusCancel に設定します。操作が取り消され、FieldChangeComplete イベントは adStatusErrorsOccurredadStatus 値を受け取ります。 Error オブジェクトには adErrOperationCancelled が含まれているため、FieldChangeComplete ハンドラーは操作が取り消されたことを認識します。 ただし、変更する前に、adStatus パラメーターの値を確認する必要があります。なぜなら、adStatusadStatusCancel に設定しても、プロシージャへの入力時にパラメーターが adStatusCantDeny に設定されている場合は効果がないからです。

操作で複数のイベントが発生する場合があります。 たとえば、Recordset オブジェクトには、フィールドの変更とレコードの変更に対するペアのイベントがあります。 たとえば、アプリケーションでフィールドの値が変更されると、WillChangeField イベント ハンドラーが呼び出されます。 操作を続行できる場合は、WillChangeRecord イベント ハンドラーも発生します。 このハンドラーでもイベントを続行できる場合は、変更が行われ、FieldChangeComplete および RecordChangeComplete イベント ハンドラーが呼び出されます。 特定の操作の Will イベント ハンドラーが呼び出される順序は定義されていないため、特定の順序でのハンドラー呼び出しに依存するコードの記述は避ける必要があります。

複数の Will イベントが発生した場合、イベントの 1 つによって保留中の操作が取り消される場合があります。 たとえば、アプリケーションでフィールドの値が変更されると、通常、WillChangeField および WillChangeRecord イベント ハンドラーの両方が呼び出されます。 ただし、最初のイベント ハンドラーで操作が取り消された場合は、関連付けられている Complete ハンドラーが adStatusOperationCancelled ですぐに呼び出されます。 2 番目のハンドラーは呼び出されません。 ただし、最初のイベント ハンドラーでイベントを続行できる場合は、もう一方のイベント ハンドラーが呼び出されます。 その後操作を取り消すと、前の例と同様に、両方の Complete イベントが呼び出されます。

ペアでないイベント ハンドラー

イベントに渡された状態が adStatusCantDeny でない限り、Status パラメーターで adStatusUnwantedEvent を返すことで、イベントのイベント通知をオフにすることができます。 たとえば、Complete イベント ハンドラーが初めて呼び出されたときに、adStatusUnwantedEvent を返すことができます。 その後、Will イベントのみを受け取ります。 ただし、一部のイベントは複数の理由でトリガーされることがあります。 その場合、イベントには Reason パラメーターがあります。 adStatusUnwantedEvent を返すと、その特定の理由で発生した場合にのみ、そのイベントの通知の受信を停止します。 つまり、イベントがトリガーされる可能性がある理由ごとに通知を受け取る可能性があります。

単一の Will イベント ハンドラーは、操作で使用されるパラメーターを調べる場合に便利です。 これらの操作パラメーターを変更するか、操作を取り消すことができます。

または、Complete イベント通知を有効のままにします。 最初の Will イベント ハンドラーが呼び出されたら、adStatusUnwantedEvent を返します。 その後、Complete イベントのみを受け取ります。

単一の Complete イベント ハンドラーは、非同期操作の管理に役立ちます。 各非同期操作には、適切な Complete イベントがあります。

たとえば、大きな Recordset オブジェクトを設定するには、長い時間がかかる場合があります。 アプリケーションが適切に記述されている場合は、操作を開始し、他の Recordset.Open(...,adAsyncExecute) 処理を続行できます。 レコードセットExecuteComplete イベントによって設定されると、最終的に通知されます。

単一のイベント ハンドラーと複数のオブジェクト

Visual C++ のようなプログラミング言語の柔軟性により、複数のオブジェクトからイベントを処理するイベント ハンドラーを 1 つ作成できます。 たとえば、複数の Connection オブジェクトのイベントを 1 つの Disconnect イベント ハンドラーで処理できます。 いずれかの接続が終了すると、Disconnect イベント ハンドラーが呼び出されます。 イベント ハンドラー オブジェクト パラメーターが対応する Connection オブジェクトに設定されるため、イベントの原因となった接続を判断できます。

Note

この手法は Visual Basic では使用できません。これは、その言語がイベント ハンドラーに関連付けることができるオブジェクトは 1 つだけであるためです。

参照

ADO イベント ハンドラーの概要
言語別の ADO イベントのインスタンス化
イベント パラメーター
イベントの種類