分享方式:


SQLCancel 函式

一致性
引進版本:ODBC 1.0 標準合規性:ISO 92

摘要
SQLCancel 會取消語句上的處理。

若要取消連接或語句上的處理,請使用 SQLCancelHandle 函式

語法

  
SQLRETURN SQLCancel(  
     SQLHSTMT     StatementHandle);  

引數

StatementHandle
[輸入]語句句柄。

傳回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

診斷

當 SQLCancel 傳回SQL_ERROR或SQL_SUCCESS_WITH_INFO時,藉由呼叫 SQLGetDiagRec 搭配SQL_HANDLE_STMT的 HandleTypeStatementHandle 句柄,即可取得相關聯的 SQLSTATE 值。 下表列出 SQLCancel 通常傳回的 SQLSTATE 值,並說明此函式內容中的每個值;表示法 “(DM)” 在驅動程式管理員傳回的 SQLSTATE 描述之前。 除非另有說明,否則與每個 SQLSTATE 值相關聯的傳回碼會SQL_ERROR。

SQLSTATE 錯誤 描述
01000 一般警告 驅動程式特定的資訊訊息。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
HY000 一般錯誤 發生錯誤,其中沒有特定的 SQLSTATE,也沒有定義任何實作特定的 SQLSTATE。 自變數 *MessageText 緩衝區中 SQLGetDiagRec回的錯誤訊息會描述錯誤及其原因。
HY001 記憶體配置錯誤 驅動程式無法配置支援執行或完成函式所需的記憶體。
HY010 函式順序錯誤 (DM) 已針對與 StatementHandle 相關聯的連接句柄呼叫異步執行函式。 呼叫 SQLCancel 函式時,這個異步函式仍在執行中。

(DM) 取消作業失敗,因為與 StatementHandle 相關聯的連接句柄上正在進行異步操作。
HY013 記憶體管理錯誤 無法處理函式呼叫,因為基礎記憶體物件無法存取,可能是因為記憶體不足的情況。
HY018 伺服器拒絕取消要求 伺服器拒絕取消要求。
HY117 聯機因為未知的交易狀態而暫停。 只允許中斷連線和唯讀函式。 (DM) 如需暫停狀態的詳細資訊,請參閱 SQLEndTran 函式
HYT01 已超過連線逾時 在數據源回應要求之前,連線逾時期限已過期。 線上逾時期間是透過 SQLSetConnectAttr 來設定,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驅動程式不支援此函式 (DM) 與 StatementHandle 相關聯的驅動程式不支援 函式。

註解

SQLCancel 可以取消語句上的下列處理類型:

  • 在語句上以異步方式執行的函式。

  • 需要數據的語句函式。

  • 在另一個線程的語句上執行的函式。

在 ODBC 2 中。x,如果應用程式在語句上未執行任何處理時呼叫 SQLCancel,SQLCancel 的效果會與 SQLFreeStmt 搭配 SQL_CLOSE 選項相同;此行為只會定義為完整性,而且應用程式應該呼叫 SQLFreeStmtSQLCloseCursor 來關閉數據指標。

呼叫 SQLCancel 以異步方式取消在語句中執行的函式或需要數據的語句上的函式時,會清除所取消函式所張貼的診斷記錄,而 SQLCancel 會張貼自己的診斷記錄;當呼叫 SQLCancel 以取消在另一個線程的語句上執行的函式時,它不會清除所取消函式的診斷記錄,也不會張貼自己的診斷記錄。

取消異步處理

應用程式以異步方式呼叫函式之後,它會重複呼叫 函式,以判斷函式是否已完成處理。 如果函式仍在處理中,則會傳回SQL_STILL_EXECUTING。 如果函式已完成處理,則會傳回不同的程序代碼。

在傳回SQL_STILL_EXECUTING的任何函式呼叫之後,應用程式可以呼叫 SQLCancel 來取消函式。 如果取消要求成功,驅動程式會傳回SQL_SUCCESS。 此訊息不代表函式實際上已取消,其表示系統已處理取消的要求。 當或 如果函式實際取消為驅動程式相依和數據源相依時。 應用程式必須繼續呼叫原始函式,直到傳回碼未SQL_STILL_EXECUTING為止。 如果已成功取消函式,傳回碼會SQL_ERROR且 SQLSTATE HY008(作業已取消)。 如果函式完成正常處理,如果函式成功或SQL_ERROR,且函式失敗,則傳回碼會SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,以及 HY008 以外的 SQLSTATE(作業已取消)。

注意

在 ODBC 3.5 中,當語句上未執行任何處理時,不會使用 SQL_CLOSE 選項將 SQLCancel 呼叫視為 SQLFreeStmt,但完全沒有作用。 若要關閉資料指標,應用程式應呼叫 SQLCloseCursor 而非 SQLCancel

如需異步處理的詳細資訊,請參閱 異步執行

取消需要數據的函式

在 SQLExecuteSQLExecDirect 傳回SQL_NEED_DATA,而且在針對所有數據執行參數傳送數據之前,應用程式可以呼叫 SQLCancel 來取消語句執行。 取消語句之後,應用程式可以再次呼叫 SQLExecuteSQLExecDirect 。 如需詳細資訊,請參閱 SQLBindParameter

在 SQLBulkOperationsSQLSetPos 傳回SQL_NEED_DATA之後,以及針對所有數據執行中數據行傳送數據之前,應用程式可以呼叫 SQLCancel 來取消作業。 取消作業之後,應用程式可以再次呼叫 SQLBulkOperationsSQLSetPos ;取消不會影響數據指標狀態或目前的數據指標位置。 如需詳細資訊,請參閱 SQLBulkOperationsSQLSetPos

取消在另一個線程上執行的函式

在多線程應用程式中,應用程式可以取消在另一個線程上執行的函式。 若要取消函式,應用程式會使用與目標函式所使用的相同語句句柄呼叫 SQLCancel ,但在不同的線程上。 取消函式的方式取決於驅動程式和操作系統。 如同以異步方式取消函式,SQLCancel傳回碼只會指出驅動程式是否成功處理要求。 只能傳回SQL_SUCCESS或SQL_ERROR;不會傳回診斷資訊。 如果原始函式已取消,則會傳回SQL_ERROR和 SQLSTATE HY008(作業已取消)。

如果在另一個線程上呼叫 SQLCancel 來取消語句執行時執行 SQL 語句,執行可能會成功並傳回SQL_SUCCESS同時取消。 在此情況下,驅動程式管理員會假設語句執行所開啟的數據指標會由取消關閉,因此應用程式將無法使用數據指標。

如需線程的詳細資訊,請參閱 多線程

如需下列資訊 請參閱
將緩衝區系結至參數 SQLBindParameter 函式
執行大量插入或更新作業 SQLBulkOperations 函式
除了 SQLCancel 的功能之外,還取消在連接句柄上以異步方式執行的函式。 SQLCancelHandle 函式
執行 SQL 語句 SQLExecDirect 函式
執行備妥的 SQL 語句 SQLExecute 函式
釋放語句句柄 SQLFreeStmt
取得診斷記錄的欄位或診斷標頭的欄位 SQLGetDiagField 函式
取得診斷數據結構的多個字段 SQLGetDiagRec 函式
傳回要傳送數據的下一個參數 SQLParamData 函式
在運行時間傳送參數數據 SQLPutData 函式
將數據指標放在數據列集中、重新整理數據列集中的數據,或更新或刪除結果集中的數據 SQLSetPos 函式

另請參閱

ODBC API 參考
ODBC 標頭檔