分享方式:


SQLExecute 函式

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

摘要
如果語句中有任何參數標記存在,SQLExecute 會使用參數標記變數的目前值來執行備妥的語句。

語法

  
SQLRETURN SQLExecute(  
     SQLHSTMT     StatementHandle);  

引數

StatementHandle
[輸入]語句句柄。

傳回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_NO_DATA、SQL_INVALID_HANDLE或SQL_PARAM_DATA_AVAILABLE。

診斷

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

SQLSTATE 錯誤 描述
01000 一般警告 驅動程式特定的資訊訊息。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
01001 數據指標作業衝突 StatementHandle 相關聯的備妥語句包含定位的更新或刪除語句,而且不會更新或刪除任何數據列或多個數據列。 (如需多個數據列更新的詳細資訊,請參閱SQL_ATTR_SIMULATE_CURSOR SQLSetStmtAttr 中的屬性。)

(函式會傳回SQL_SUCCESS_WITH_INFO。)
01003 set 函式中排除的 NULL 值 StatementHandle 相關聯的備妥語句包含一個集合函式(例如 AVGMAXMIN 等),但在套用函式之前,不會 排除 COUNT 集合函式和 NULL 自變數值。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
01004 字串數據,右截斷 針對輸出參數傳回的字串或二進位數據,導致截斷非空白字元或非 NULL 二進位數據。 如果它是字串值,則會將其右截斷。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
01006 許可權未撤銷 StatementHandle 相關聯的備妥語句是 REVOKE 語句,而且用戶沒有指定的許可權。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
01007 未授與許可權 StatementHandle 相關聯的備妥語句是 GRANT 語句,且無法將指定的許可權授與使用者。
01S02 選項值已變更 由於實作工作條件,指定的語句屬性無效,因此會暫時取代類似的值。 (可以呼叫 SQLGetStmtAttr 來判斷暫時替代的值為何。替代值對 StatementHandle 有效,直到數據指標關閉為止,此時語句屬性會還原為其先前的值。 可以變更的語句屬性包括:SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH、SQL_ATTR_MAX_ROWS、SQL_ATTR_QUERY_TIMEOUT和SQL_ATTR_SIMULATE_CURSOR。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
01S07 小數截斷 輸入/輸出或輸出參數所傳回的數據被截斷,使數值數據類型的小數部分被截斷,或是時間、時間戳或間隔數據類型的時間元件小數部分被截斷。

(函式會傳回SQL_SUCCESS_WITH_INFO。)
07002 COUNT 欄位不正確 SQLBindParameter 中指定的參數數目小於 *StatementText 中所包含 SQL 語句中的參數數目。

已呼叫 SQLBindParameter 並將 ParameterValuePtr 設定為 null 指標,StrLen_or_IndPtr未設定為 SQL_NULL_DATA 或 SQL_DATA_AT_EXEC,且 InputOutputType 未設定為 SQL_PARAM_OUTPUT,因此 SQLBindParameter 中指定的參數數目大於 *StatementText 中包含的 SQL 語句中的參數數目。
07006 受限制的數據類型屬性違規 系結參數之 SQLBindParameter 中 ValueType 自變數所識別的數據值無法轉換成 SQLBindParameterParameterType 自變數所識別的數據類型。

系結為 SQL_PARAM_INPUT_OUTPUT 或 SQL_PARAM_OUTPUT 的參數所傳回的數據值無法轉換成 SQLBindParameterValueType 自變數所識別的數據類型。

(如果無法轉換一或多個數據列的數據值,但成功傳回一或多個數據列,則此函式會傳回SQL_SUCCESS_WITH_INFO。
07007 限制的參數值違規 參數類型SQL_PARAM_INPUT_OUTPUT_STREAM僅用於傳送和接收部分數據的參數。 此參數類型不允許輸入系結緩衝區。

當參數類型為SQL_PARAM_INPUT_OUTPUT,且在 SQLBindParameter 中指定的 *StrLen_or_IndPtr不等於 SQL_NULL_DATA、SQL_DEFAULT_PARAM、SQL_LEN_DATA_AT_EXEC(len) 或 SQL_DATA_AT_EXEC 時,就會發生此錯誤。
07S01 預設參數的使用無效 使用 SQLBindParameter 設定的參數值已SQL_DEFAULT_PARAM,且對應的參數不是 ODBC 標準程式調用的參數。
08S01 通訊連結失敗 驅動程式與驅動程式連線的數據源之間的通訊連結在函式完成處理之前失敗。
21S02 衍生數據表的程度不符合數據列清單 StatementHandle 相關聯的備妥語句包含 CREATE VIEW 語句,而未限定的數據行清單(SQL 語句之數據行標識元自變數中為檢視所指定的數據行數目),包含的名稱多於 SQL 語句之查詢規格自變數所定義之衍生數據表中的數據行數目。
22001 字串數據,右截斷 將字元或二進位值指派給數據行會導致截斷非空白(字元)或非 Null(二進位)字元或位元組。
22002 需要指標變數,但未提供 NULL 數據系結至 sqlBindParameter設定StrLen_or_IndPtr為 Null 指標的輸出參數
22003 超出範圍的數值 StatementHandle 相關聯的備妥語句包含系結的數值參數,而且參數值會在指派給相關聯的數據表數據行時,導致數位的整個(而不是小數部分)被截斷。

傳回一或多個輸入/輸出或輸出參數的數值(作為數值或字串),會導致截斷數位的整個(而不是小數部分)。
22007 無效的日期時間格式 StatementHandle 相關聯的備妥語句包含一個 SQL 語句,其中包含日期、時間或時間戳結構做為係結參數,而且參數分別是無效的日期、時間或時間戳。

輸入/輸出或輸出參數係結至日期、時間或時間戳 C 結構,而傳回參數中的值分別為無效的日期、時間或時間戳。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
22008 日期時間欄位溢位 StatementHandle 相關聯的備妥語句包含包含 datetime 表達式的 SQL 語句,計算時會產生無效的日期、時間或時間戳結構。

針對輸入/輸出或輸出參數計算的 datetime 運算式,導致日期、時間或時間戳 C 結構無效。
22012 除以零 StatementHandle 相關聯的備妥語句包含算術表示式,導致零除。

針對輸入/輸出或輸出參數計算的算術運算式,導致除以零。
22015 間隔欄位溢位 *StatementText 包含確切的數值或間隔參數,當轉換成間隔 SQL 數據類型時,會導致有效位數遺失。

*StatementText 包含一個包含多個字段的 interval 參數,當轉換成數據行中的數值數據類型時,在數值數據類型中沒有表示。

*StatementText 包含指派給間隔 SQL 類型的參數數據,而且間隔 SQL 類型中沒有 C 型別的值表示法。

將精確數值或間隔 SQL 類型的輸入/輸出或輸出參數指派給間隔 C 型別,會造成有效位數遺失。

當輸入/輸出或輸出參數指派給間隔 C 結構時,間隔數據結構中沒有任何數據表示法。
22018 轉換規格的字元值無效 *StatementText 包含的 C 類型是精確或近似數值、日期時間或間隔數據類型;數據行的 SQL 類型是字元數據類型;而且數據行中的值不是系結 C 型別的有效常值。

傳回輸入/輸出或輸出參數時,SQL 類型是精確或近似的數值、日期時間或間隔數據類型;C 類型SQL_C_CHAR;和數據行中的值不是系結 SQL 類型的有效常值。
22019 無效的逸出字元 StatementHandle 相關聯的備妥語句包含 WHERE 子句中具有 ESCAPE 的 LIKE詞,而 ESCAPE 後面的出字元長度不等於 1。
22025 無效的逸出序列 與 StatementHandle 相關聯的備妥語句包含 WHERE 子句中的 LIKE 模式值 ESCAPE 逸出字元”,而模式值中逸出字元後面的字元不是 “%” 或 “_”。
23000 完整性條件約束違規 StatementHandle 相關聯的備妥語句包含參數。 針對在相關聯數據表數據行中定義為 NOT NULL 的數據行而言,參數值為 NULL,針對限制只包含唯一值的數據行提供重複值,或違反某些其他完整性條件約束。
24000 無效的數據指標狀態 數據指標位於 SQLFetchSQLFetchScrollStatementHandle 上。 如果 SQLFetch 或 SQLFetchScroll 尚未傳回SQL_NO_DATA,而且如果 SQLFetch SQLFetchScroll 傳回SQL_NO_DATA,驅動程式就會傳回此錯誤。

語句Handle 上 已開啟數據指標

StatementHandle 相關聯的備妥語句包含定位的更新或刪除語句,而數據指標位於結果集的開頭或結果集結尾之後。
40001 串行化失敗 交易因為與另一個交易發生資源死結而回復。
40003 語句完成未知 此函式執行期間相關聯的連接失敗,且無法判斷交易的狀態。
42000 語法錯誤或存取違規 用戶沒有許可權執行與 StatementHandle 相關聯的備妥語句。
44000 WITH CHECK OPTION 違規 StatementHandle 相關聯的備妥語句包含在檢視數據表上執行的 INSERT 語句,或是透過指定 WITH CHECK OPTION 所建立之檢視數據表衍生的數據表,使得一或多個受 INSERT 語句影響的數據列將不再出現在檢視數據表中。

StatementHandle 相關聯的備妥語句包含在檢視數據表上執行的 UPDATE 語句,或透過指定 WITH CHECK OPTION 所建立之檢視數據表衍生的數據表,因此,一或多個受 UPDATE 語句影響的數據列將不再出現在檢視數據表中。
HY000 一般錯誤 發生錯誤,其中沒有特定的 SQLSTATE,也沒有定義任何實作特定的 SQLSTATE。 *MessageText 緩衝區中 SQLGetDiagRec回的錯誤訊息描述錯誤及其原因。
HY001 記憶體配置錯誤 驅動程式無法配置支援執行或完成函式所需的記憶體。
HY008 作業已取消 已針對 StatementHandle 啟用異步處理。 已呼叫函式,並在完成執行之前,在 StatementHandle 上呼叫 SQLCancelSQLCancelHandle。 然後在 StatementHandle再次呼叫函式。

呼叫函式,並在完成執行之前,從多線程應用程式中的不同線程呼叫語句Handle 或 SQLCancelHandle
HY010 函式順序錯誤 (DM) 已針對與 StatementHandle 相關聯的連接句柄呼叫異步執行函式。 呼叫 SQLExecute 函式時,這個異步函式仍在執行中。

(DM) 已針對 StatementHandle 呼叫 SQLExecuteSQLExecDirectSQLMoreResults,並傳回SQL_PARAM_DATA_AVAILABLE。 在擷取所有數據流參數的數據之前,會呼叫此函式。

(DM) 呼叫 StatementHandle 的異步執行函式(而非此函式),並在呼叫此函式時仍在執行中。

(DM) 已針對 StatementHandle 呼叫 SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos,並傳回SQL_NEED_DATA。 在針對所有數據執行中參數或數據行傳送數據之前,會呼叫此函式。

(DM) 聲明 沒有準備好。
HY013 記憶體管理錯誤 無法處理函式呼叫,因為基礎記憶體物件無法存取,可能是因為記憶體不足的情況。
HY090 無效的字串或緩衝區長度 使用 SQLBindParameter 設定的參數值是 null 指標,而且參數長度值不是 0、SQL_NULL_DATA、SQL_DATA_AT_EXEC、SQL_DEFAULT_PARAM或小於或等於SQL_LEN_DATA_AT_EXEC_OFFSET。

使用 SQLBindParameter 設定的參數值不是 null 指標;C 數據類型SQL_C_BINARY或SQL_C_CHAR;參數長度值小於 0,但未SQL_NTS、SQL_NULL_DATA、SQL_DEFAULT_PARAM或SQL_DATA_AT_EXEC,或小於或等於SQL_LEN_DATA_AT_EXEC_OFFSET。

SQLBindParameter系結的參數長度值已設定為SQL_DATA_AT_EXEC;SQL 類型是SQL_LONGVARCHAR、SQL_LONGVARBINARY或長數據源特定數據類型;而 SQLGetInfoSQL_NEED_LONG_DATA_LEN資訊類型為 “Y”。
HY105 無效的參數類型 在 SQLBindParameter為自變數 InputOutputType 指定的值是SQL_PARAM_OUTPUT,而且參數是輸入參數。
HY109 無效的數據指標位置 備妥的語句是定位的更新或刪除語句,而且數據指標位於已刪除或無法擷取的數據列上(由 SQLSetPosSQLFetchScroll)。
HY117 聯機因為未知的交易狀態而暫停。 只允許中斷連線和唯讀函式。 (DM) 如需暫停狀態的詳細資訊,請參閱 SQLEndTran 函式
HYC00 未實作選擇性功能 驅動程式或數據源不支援SQL_ATTR_CONCURRENCY和SQL_ATTR_CURSOR_TYPE語句屬性的目前設定組合。

SQL_ATTR_USE_BOOKMARKS語句屬性已設定為 SQL_UB_VARIABLE,且SQL_ATTR_CURSOR_TYPE語句屬性已設定為驅動程式不支援書籤的數據指標類型。
HYT00 逾時已超過 數據源傳回結果集之前,查詢逾時期限已過期。 逾時期間是透過 SQLSetStmtAttr 來設定,SQL_ATTR_QUERY_TIMEOUT。
HYT01 已超過連線逾時 在數據源回應要求之前,連線逾時期限已過期。 線上逾時期間是透過 SQLSetConnectAttr 來設定,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驅動程式不支援此函式 (DM) 與 StatementHandle 相關聯的驅動程式不支援 函式。
IM017 在異步通知模式中停用輪詢 每當使用通知模型時,輪詢就會停用。
IM018 尚未呼叫 SQLCompleteAsync ,以完成此句柄上的先前異步操作。 如果句柄上的上一個函式呼叫傳回SQL_STILL_EXECUTING且啟用通知模式, 則必須在句柄上呼叫 SQLCompleteAsync ,才能執行後續處理並完成作業。

SQLExecute 可以根據數據源評估與 語句相關聯的 SQL 語句時,傳回 SQLPrepare 可傳回的任何 SQLSTATE。

註解

SQLExecute 會執行 SQLPrepare 準備的語句。 在應用程式處理或捨棄 SQLExecute 呼叫的結果之後,應用程式可以使用新的參數值再次呼叫 SQLExecute。 如需備妥執行的詳細資訊,請參閱 準備執行

若要多次執行 SELECT 語句,應用程式必須先呼叫 SQLCloseCursor ,才能重新執行 SELECT 語句。

如果數據源處於手動認可模式(需要明確交易起始),且尚未起始交易,則驅動程式會在傳送 SQL 語句之前起始交易。 如需詳細資訊,請參閱交易

如果應用程式使用 SQLPrepare 來準備和 SQLExecute 來提交 COMMITROLLBACK 語句,則 DBMS 產品之間將無法互通。 若要認可或回復交易,請呼叫 SQLEndTran

如果 SQLExecute 遇到數據執行中參數,則會傳回SQL_NEED_DATA。 應用程式會使用 SQLParamDataSQLPutData 來傳送數據。 請參閱 SQLBindParameterSQLParamDataSQLPutData傳送長數據

如果 SQLExecute 執行搜尋的更新、插入或刪除語句,而不會影響數據源的任何數據列,則對 SQLExecute呼叫會傳回SQL_NO_DATA。

如果SQL_ATTR_PARAMSET_SIZE語句屬性的值大於 1,且 SQL 語句包含至少一個參數標記,SQLExecute 就會針對呼叫 SQLBindParameter 時所指向之數位中 *ParameterValuePtr 自變數所指向的每個參數值集執行 SQL 語句一次。 如需詳細資訊,請參閱 參數值的陣列。

如果啟用書籤並執行不支援書籤的查詢,驅動程式應該嘗試藉由變更屬性值並傳回 SQLSTATE 01S02 (選項值變更),將環境強制設定為支援書籤的環境。 如果無法變更屬性,驅動程式應該會傳回 SQLSTATE HY024 (無效的屬性值)。

注意

使用連接共用時,應用程式不得執行變更資料庫或資料庫內容的 SQL 語句,例如 SQL Server 中的 USE 資料庫 語句,這會變更數據源所使用的目錄。

程式碼範例

請參閱 SQLBindParameterSQLBulkOperationsSQLPutDataSQLSetPos

如需下列資訊 請參閱
將緩衝區系結至結果集中的數據行 SQLBindCol 函式
取消語句處理 SQLCancel 函式
關閉游標 SQLCloseCursor 函式
執行認可或復原作業 SQLEndTran 函式
執行 SQL 語句 SQLExecDirect 函式
擷取多個數據列 SQLFetch 函式
擷取數據區塊或捲動結果集 SQLFetchScroll 函式
釋放語句句柄 SQLFreeStmt 函式
傳回數據指標名稱 SQLGetCursorName 函式
擷取部分或所有數據行的數據 SQLGetData 函式
傳回要傳送數據的下一個參數 SQLParamData 函式
準備語句以供執行 SQLPrepare 函式
在運行時間傳送參數數據 SQLPutData 函式
設定數據指標名稱 SQLSetCursorName 函式
設定語句屬性 SQLSetStmtAttr 函式

另請參閱

ODBC API 參考
ODBC 標頭檔