非同期モードと SQLCancel

ODBC 関数には、同期して動作する関数と非同期に動作する関数があります。アプリケーションでは、ステートメント ハンドルまたは接続ハンドルのいずれかに対して非同期動作を有効にすることができます。オプションが接続ハンドル用に設定されている場合、接続ハンドルのすべてのステートメント ハンドルに影響します。アプリケーションで次のステートメントを使用すると、非同期動作を有効または無効にすることができます。

SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);
SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE,
                        SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);

アプリケーションが同期モードで ODBC 関数を呼び出した場合、サーバーでのコマンドの実行が完了したことがドライバに通知されるまでは、ドライバからアプリケーションに制御が戻りません。

非同期動作の場合は、ドライバからサーバーにコマンドを送信する前でも、ドライバからアプリケーションに直ちに制御が戻ります。ドライバは、リターン コードを SQL_STILL_EXECUTING に設定します。アプリケーションでは他の作業を実行できます。

アプリケーションでコマンドが完了したかどうかをテストするときは、ドライバに対して同じ関数を同じパラメータを指定して呼び出します。ドライバがサーバーからまだ応答を受け取っていない場合、SQL_STILL_EXECUTING が再び返されます。アプリケーションでは、リターン コードが SQL_STILL_EXECUTING 以外になるまで、定期的にコマンドをテストする必要があります。アプリケーションで他のリターン コードを受け取ると、それが SQL_ERROR であっても、コマンドが完了したことがわかります。

コマンドが長時間未完了になることがあります。アプリケーションで応答を待たずにコマンドをキャンセルする必要がある場合、未完了のコマンドと同じステートメント ハンドルで SQLCancel を呼び出すと、コマンドをキャンセルできます。SQLCancel を使用するのはこの場合だけです。結果セットを使用して処理しているときに、結果セットの残りの部分をキャンセルする場合、プログラマによっては、SQLCancel を使用する場合があります。未解決の結果セットの残りの部分をキャンセルするには、SQLCancel ではなく、SQLMoreResults または SQLCloseCursor を使用してください。