非同期関数の完了の通知
Windows 8 SDK では、ODBC によって、非同期操作が完了したときにアプリケーションに通知するメカニズムが追加されました。これは「完了時の通知」 と言います。 (詳細については、非同期実行 (通知メソッド)を参照してください。) このトピックでは、ドライバー開発者向けの問題の一部について説明します。
ドライバー マネージャーとドライバーの間のインターフェイス
ドライバー マネージャーは、内部的にコールバック関数 SQLAsyncNotificationCallback 関数を提供します。 SQLAsyncNotificationCallback はドライバーによってのみ呼び出すことができます。アプリケーションで直接呼び出すことはできません。 ドライバーは、最後にSQL_STILL_EXECUTINGを返した後にサーバーから新しいデータを受信するたびに、SQLAsyncNotificationCallback を呼び出します。
ドライバー マネージャーは、対応する関数がSQL_STILL_EXECUTINGを返した後、非同期操作の実行で何らかの進行状況が行われたときにドライバー マネージャーに通知できるように、コールバック メカニズムを提供します
ドライバー マネージャーは、ドライバーの接続ハンドルにSQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACK属性を設定します。NULL 以外の関数ポインターは、SQL_ASYNC_NOTIFICATION_CALLBACK型であり、ドライバーがそのハンドルに対する非同期操作に対して通知モードで動作するようにします。 同様に、ドライバー マネージャーは、ドライバーステートメント ハンドルのSQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK属性を NULL 以外の関数ポインター (SQL_ASYNC_NOTIFICATION_CALLBACK型) で設定し、ドライバーがそのハンドルに対する非同期操作の通知モードで動作するようにします。
非同期操作がドライバー ハンドルに対して実行される場合、非同期ドライバー関数は非ブロッキング スタイルで動作する必要があります。 操作をすぐに完了できない場合、ドライバー関数はSQL_STILL_EXECUTINGを返す必要があります。 この要件は、ポーリング モードと通知モードの両方に当てはまります。
ハンドルが通知非同期モードの場合、ドライバーは、SQL_STILL_EXECUTINGを返した後、SQL_ATTR_ASYNC_DBC_NOTIFICATION_CALLBACKまたはSQL_ATTR_ASYNC_STMT_NOTIFICATION_CALLBACK属性の値である通知コールバック関数を呼び出す必要があります。 つまり、1 つの戻りSQL_STILL_EXECUTINGは、通知コールバック関数の 1 つの呼び出しとペアにする必要があります。 ドライバーは、コールバック関数パラメーター pContext の値として、SQL_ATTR_ASYNC_DBC_NOTIFICATION_CONTEXTまたはSQL_ATTR_ASYNC_STMT_NOTIFICATION_CONTEXTハンドル属性の現在の値を使用する必要があります。
ドライバーは、ドライバー関数を呼び出すスレッドでコールバックすることはできません。関数が戻る前に進行状況を通知する理由はありません。 ドライバーは、コールバックに独自のスレッドを使用する必要があります。 ドライバー マネージャーは、広範な処理ロジックを実行するためにドライバーのコールバック スレッドを使用しません。
ドライバー マネージャーは、ドライバーがコールバックした後、元の関数をもう一度呼び出します。 ドライバー マネージャーは、アプリケーション スレッドでもドライバー スレッドでもないスレッドを使用できます。 ドライバーがスレッドに関連付けられている情報 (セキュリティ トークンやユーザー識別子など) を使用する場合、ドライバーは最初の非同期呼び出しで必要な情報を保存し、非同期操作全体が完了する前に保存された値を使用する必要があります。 通常、そのような情報を使用する必要があるのは SQLDriverConnect、SQLConnect、または SQLBrowseConnect だけです。