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 的 HandleType 和 StatementHandle 句柄來取得相關聯的 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 相關聯的備妥語句包含一個集合函式(例如 AVG、 MAX、 MIN 等),但在套用函式之前,不會 排除 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 自變數所識別的數據值無法轉換成 SQLBindParameter 中 ParameterType 自變數所識別的數據類型。 系結為 SQL_PARAM_INPUT_OUTPUT 或 SQL_PARAM_OUTPUT 的參數所傳回的數據值無法轉換成 SQLBindParameter 中 ValueType 自變數所識別的數據類型。 (如果無法轉換一或多個數據列的數據值,但成功傳回一或多個數據列,則此函式會傳回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 | 無效的數據指標狀態 | 數據指標位於 SQLFetch 或 SQLFetchScroll 的 StatementHandle 上。 如果 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 上呼叫 SQLCancel 或 SQLCancelHandle。 然後在 StatementHandle 上再次呼叫函式。 呼叫函式,並在完成執行之前,從多線程應用程式中的不同線程呼叫語句Handle 或 SQLCancelHandle。 |
HY010 | 函式順序錯誤 | (DM) 已針對與 StatementHandle 相關聯的連接句柄呼叫異步執行函式。 呼叫 SQLExecute 函式時,這個異步函式仍在執行中。 (DM) 已針對 StatementHandle 呼叫 SQLExecute、SQLExecDirect 或 SQLMoreResults,並傳回SQL_PARAM_DATA_AVAILABLE。 在擷取所有數據流參數的數據之前,會呼叫此函式。 (DM) 呼叫 StatementHandle 的異步執行函式(而非此函式),並在呼叫此函式時仍在執行中。 (DM) 已針對 StatementHandle 呼叫 SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos,並傳回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或長數據源特定數據類型;而 SQLGetInfo 中SQL_NEED_LONG_DATA_LEN資訊類型為 “Y”。 |
HY105 | 無效的參數類型 | 在 SQLBindParameter 中為自變數 InputOutputType 指定的值是SQL_PARAM_OUTPUT,而且參數是輸入參數。 |
HY109 | 無效的數據指標位置 | 備妥的語句是定位的更新或刪除語句,而且數據指標位於已刪除或無法擷取的數據列上(由 SQLSetPos 或 SQLFetchScroll)。 |
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 來提交 COMMIT 或 ROLLBACK 語句,則 DBMS 產品之間將無法互通。 若要認可或回復交易,請呼叫 SQLEndTran。
如果 SQLExecute 遇到數據執行中參數,則會傳回SQL_NEED_DATA。 應用程式會使用 SQLParamData 和 SQLPutData 來傳送數據。 請參閱 SQLBindParameter、 SQLParamData、 SQLPutData 和 傳送長數據。
如果 SQLExecute 執行搜尋的更新、插入或刪除語句,而不會影響數據源的任何數據列,則對 SQLExecute 的呼叫會傳回SQL_NO_DATA。
如果SQL_ATTR_PARAMSET_SIZE語句屬性的值大於 1,且 SQL 語句包含至少一個參數標記,SQLExecute 就會針對呼叫 SQLBindParameter 時所指向之數位中 *ParameterValuePtr 自變數所指向的每個參數值集執行 SQL 語句一次。 如需詳細資訊,請參閱 參數值的陣列。
如果啟用書籤並執行不支援書籤的查詢,驅動程式應該嘗試藉由變更屬性值並傳回 SQLSTATE 01S02 (選項值變更),將環境強制設定為支援書籤的環境。 如果無法變更屬性,驅動程式應該會傳回 SQLSTATE HY024 (無效的屬性值)。
注意
使用連接共用時,應用程式不得執行變更資料庫或資料庫內容的 SQL 語句,例如 SQL Server 中的 USE 資料庫 語句,這會變更數據源所使用的目錄。
程式碼範例
請參閱 SQLBindParameter、 SQLBulkOperations、 SQLPutData 和 SQLSetPos。
相關函數
如需下列資訊 | 請參閱 |
---|---|
將緩衝區系結至結果集中的數據行 | SQLBindCol 函式 |
取消語句處理 | SQLCancel 函式 |
關閉游標 | SQLCloseCursor 函式 |
執行認可或復原作業 | SQLEndTran 函式 |
執行 SQL 語句 | SQLExecDirect 函式 |
擷取多個數據列 | SQLFetch 函式 |
擷取數據區塊或捲動結果集 | SQLFetchScroll 函式 |
釋放語句句柄 | SQLFreeStmt 函式 |
傳回數據指標名稱 | SQLGetCursorName 函式 |
擷取部分或所有數據行的數據 | SQLGetData 函式 |
傳回要傳送數據的下一個參數 | SQLParamData 函式 |
準備語句以供執行 | SQLPrepare 函式 |
在運行時間傳送參數數據 | SQLPutData 函式 |
設定數據指標名稱 | SQLSetCursorName 函式 |
設定語句屬性 | SQLSetStmtAttr 函式 |