スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド
ODBC対応アプリケーションプログラムからHiRDBをアクセスする場合,ODBC関数を非同期に実行できます。
ODBC関数を同期実行する場合,関数呼出しが終了するまで,ODBCドライバはアプリケーションプログラムに制御を返せません。非同期実行の場合だと,任意にアプリケーションプログラムに制御を返せます。そのため,ODBC関数が非同期実行されている間に,アプリケーションプログラムはほかの処理を実行できます。
非同期実行できるODBC関数を次に示します。
ODBC関数を非同期に実行する場合の手順を次に示します。
| fOption | 設定内容 |
|---|---|
| SQL_ASYNC_ENABLE | SQL_ASYNC_ENABLE_OFF,又はSQL_ASYNC_ENABLE _ON |
| SQL_BIND_TYPE | 設定できません。 |
| SQL_MAX_LENGTH | サーバの制限値,又はユーザの指定値 |
| SQL_NOSCAN (Default=FALSE) | SQL_NOSCAN_OFF,又はSQL_NOSCAN_ON |
| SQL_QUERY_TIMEOUT | 設定できません。 |
| SQL_MAX_ROWS | サーバの制限値,又はユーザの指定値 |
| fOption | 設定内容 |
|---|---|
| SQL_ACCESS_MODE | SQL_MODE_READ_WRITE固定 |
| SQL_AUTOCOMMIT | SQL_AUTOCOMMIT_OFF,又は SQL_AUTOCOMMIT_ON |
| SQL_LOGON_TIMEOUT | 設定できません。 |
| SQL_OPT_TRACE | 0(Off)固定。 ODBCドライバマネージャから返されるオプションです。 |
| SQL_OPT_TRACEFILE | NULL固定。 ODBCドライバマネージャから返されるオプションです。 |
| SQL_TRANSLATE_DLL | 設定できません。 |
| SQL_TRANSLATE_OPTION | 設定できません。 |
| SQL_TXN_ISOLATION | SQL_TXN_READ_UNCOMMITED |
| SQL_ASYNC_ENABLE | SQL_ASYNC_ENABLE_OFF,又はSQL_ASYNC_ENABLE _ON |
非同期実行中のODBC関数をキャンセルするには,SQLCancelを呼び出します。
SQLCancelは,指定されたhstmtが現在非同期実行中であることを確認できた時点で,サーバに対して処理のキャンセル要求をします。
SQLCancelの戻り値では,キャンセル要求が終了したかどうかを通知し,実際に非同期実行の関数がキャンセルされたかどうかは処理中の非同期実行の関数を呼び出して,その戻り値で判断します。関数が実行中の場合はSQL_STILL_EXECUTINGが返され,キャンセル処理が終了している場合はSQL_ERRORとSQLSTATE S1008(処理のキャンセル)が返されます。また,既に正常に終了していた場合や,ほかのエラーが発生した場合には,SQL_SUCCESSやSQL_ERRORなどのコードが返ります。
マルチスレッドのアプリケーションプログラムでは,hstmtで同期実行しているODBC関数をキャンセルできます。キャンセルする場合,アプリケーションプログラムはキャンセルする関数に使用されているhstmtと同じhstmtで,異なるスレッドからSQLcancelを呼び出します。
SQLCancelの戻り値には,ドライバが要求を正しく受けたかどうかを表す値が返されます。また,元の関数の戻り値には,SQL_SUCCESS,又はSQL_ERRORとSQLSTATE S1008(処理のキャンセル)が返されます。
非同期実行のコーディング例を次に示します。
SQLSetStmtOption(hstmt,SQL_ASYNC_ENABLE,SQL_ASYNC_ENABLE_ON);
:
SQLFetchでの検索処理
rc=SQLFetch(hstmt);
while(rc==SQL_STILL_EXECUTING)
{
:
非同期実行中 APの処理を続行
:
if(処理のキャンセル要求あり)
{
rc=SQL_Cancel(hstmt);
if(rc==SQL_ERROR){ キャンセル要求失敗 エラー処理へ }
}
rc=SQLFetch(hstmt);
}
if(rc == SQL_ERROR){ エラー処理へ }
検索データ加工処理へ
:
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.