在 CLI 應用程式中非同步執行函數是使用 CLI 進行程式設計的較大作業的一部分。 啟用非同步函數並使用這些函數的作業包括確保支援非同步執行、起始設定應用程式以進行非同步執行,以及使用函數以利用非同步執行。
開始之前
在開始設定 CLI 應用程式以進行非同步執行之前,您必須先配置環境控點及連線控點。 這是起始設定 CLI 應用程式作業的一部分。
關於此作業
附註: 從 9.7Fix Pack 4 開始,此功能也可以與 CLI 載入處理功能搭配使用。
在任何一個連線上,應用程式最多可以有 1 個以非同步模式執行的作用中功能。 如果在連線層次啟用非同步模式,則會啟用所有已配置的陳述式,以及在連線上配置的未來陳述式控點,以進行非同步執行。
程序
- 使用 InfoType SQL_ASYNC_MODE 來呼叫
SQLGetInfo() ,以確保可以非同步呼叫函數。 例如: /* See what type of Asynchronous support is available. */
rc = SQLGetInfo( hdbc, /* Connection handle */
SQL_ASYNC_MODE, /* Query the support available */
&ubuffer, /* Store the result in this variable */
4,
&outlen);
對
SQLGetInfo() 函數的呼叫將傳回下列其中一個值:
- SQL_AM_STATEMENT: 可以在陳述式層次開啟或關閉非同步執行。
- SQL_AM_CONNECTION: 可以在連線層次開啟或關閉非同步執行。
- SQL_AM_NONE: 不支援非同步執行。 您的應用程式無法設定非同步執行。 由於下列兩個原因之一,將會傳回此項目:
- 資料來源本身不支援非同步執行。
- CLI/ODBC 配置關鍵字 AXX_ENCODE_CASE_ONE syncenable 已特別設定為停用非同步執行。
- 使用
SQLSetStmtAttr() 或 SQLSetConnectAttr() 設定 SQL_ATTR_ASYNC_ENABLE 屬性,以在 SQLGetInfo() 的回覆值為 SQL_AM_STATEMENT 或 SQL_AM_CONNECTION 時啟用應用程式進行非同步執行。
- If the return value is SQL_AM_STATEMENT, set SQL_ATTR_ASYNC_ENABLE to SQL_ASYNC_ENABLE_ON using
SQLSetStmtAttr(). 例如: /* Set statement level asynchronous execution on */
rc = SQLSetStmtAttr( hstmt, /* Statement handle */
SQL_ATTR_ASYNC_ENABLE,
(SQLPOINTER) SQL_ASYNC_ENABLE_ON,
0);
- 如果回覆值為 SQL_AM_CONNECTION ,請使用
SQLSetConnectAttr()將 SQL_ATTR_ASYNC_ENABLE 設為 SQL_ASYNC_ENABLE_ON。 例如: /* Set connection level asynchronous execution on */
rc = SQLSetConnectAttr( hstmt, /* Connection handle */
SQL_ATTR_ASYNC_ENABLE,
(SQLPOINTER) SQL_ASYNC_ENABLE_ON,
0);
- 呼叫支援非同步執行的函數,並輪詢非同步函數。 請參閱 SQL_ATTR_ASYNC_ENABLE 連線或陳述式屬性,以取得可非同步執行的函數清單。
應用程式透過使用它在第一次呼叫函數時所使用的相同引數反覆地呼叫函數,來判定函數是否已完成。 回覆碼 SQL_STILL_EXECUTING 指出尚未完成,任何其他值則指出已完成。 SQL_STILL_EXECUTING 以外的值與同步執行時傳回的回覆碼相同。
下列範例示範一般
while 迴圈,其中將這兩種可能的結果納入考量:
while ( (rc = SQLExecDirect(hstmt, sqlstmt, SQL_NTS) ) == SQL_STILL_EXECUTING)
{
/* Other processing can be performed here, between each call to
* see if SQLExecDirect() has finished running asynchronously.
* This section will never run if CLI runs the function
* synchronously.
*/
}
/* The application continues at this point when SQLExecDirect() */
/* has finished running. */