SQLExtendedFetch 函式
一致性
引進的版本:ODBC 1.0 標準合規性:已淘汰
摘要
SQLExtendedFetch 會從結果集擷取指定的數據列集,並傳回所有系結數據行的數據。 數據列集可以在絕對位置或相對位置或書籤指定。
注意
在 ODBC 3*.x*中, SQLExtendedFetch 已由 SQLFetchScroll 取代。 ODBC 3*.x* 應用程式不應該呼叫 SQLExtendedFetch,而是應該呼叫 SQLFetchScroll。 使用 ODBC 2*.x* 驅動程式時,驅動程式管理員會將 SQLFetchScroll 對應至 SQLExtendedFetch。 如果您想要使用呼叫它的 ODBC 2*.x* 應用程式,ODBC 3*.x* 驅動程式應該支援 SQLExtendedFetch 。 如需詳細資訊,請參閱附錄 G:回溯相容性的驅動程序指導方針中的和 、可卷動的數據指標和回溯相容性 。
語法
SQLRETURN SQLExtendedFetch(
SQLHSTMT StatementHandle,
SQLUSMALLINT FetchOrientation,
SQLLEN FetchOffset,
SQLULEN * RowCountPtr,
SQLUSMALLINT * RowStatusArray);
引數
StatementHandle
[輸入]語句句柄。
FetchOrientation
[輸入]擷取的類型。 這與 SQLFetchScroll 中的 FetchOrientation 相同。
FetchOffset
[輸入]要擷取的數據列數目。 這與 SQLFetchScroll 中的 FetchOffset 相同,但有一個例外狀況。 當 FetchOrientation SQL_FETCH_BOOKMARK時,FetchOffset 是固定長度的書籤,而不是書籤的位移。 換句話說, SQLExtendedFetch 會從這個自變數擷取書籤,而不是SQL_ATTR_FETCH_BOOKMARK_PTR語句屬性。 它不支援可變長度的書籤,也不支援從書籤擷取位移 (0 以外的 0) 的數據列集。
RowCountPtr
[輸出]緩衝區的指標,用來傳回實際擷取的數據列數目。 這個緩衝區與 SQL_ATTR_ROWS_FETCHED_PTR 語句屬性所指定的緩衝區相同。 此緩衝區僅供 SQLExtendedFetch 使用。 SQLFetch 或 SQLFetchScroll 不會使用它。
RowStatusArray
[輸出]陣列的指標,用來傳回每個數據列的狀態。 此陣列會以與 SQL_ATTR_ROW_STATUS_PTR語句屬性所指定的陣列相同方式使用。
不過,此陣列的位址不會儲存在 IRD 的 SQL_DESC_STATUS_ARRAY_PTR 欄位中。 此外,當 SQLExtendedFetch 呼叫 SQLExtendedFetch 之後呼叫此陣列時,只有 SQLExtendedFetch 和 SQLBulkOperations 搭配 operation of SQL_ADD 或 SQLSetPos 使用。 SQLFetch 或 SQLFetchScroll 不會使用它,而且在 SQLFetch 或 SQLFetchScroll 之後呼叫 SQLBulkOperations 或 SQLSetPos 時,不會使用 SQLBulkOperations 或 SQLSetPos。 呼叫任何擷取函式之前,呼叫具有 SQL_ADD 作業的 SQLBulkOperations 時,也不會使用它。 換句話說,它只會用於語句狀態 S7。 語句中不會使用 S5 或 S6。 如需詳細資訊,請參閱 附錄 B:ODBC 狀態轉換數據表中的語句轉換 。
應用程式應該在 RowStatusArray 自變數中提供有效的指標;如果不是,SQLExtendedFetch 的行為,以及在 SQLExtendedFetch 定位數據指標之後呼叫 SQLBulkOperations 或 SQLSetPos 的行為是未定義的。
傳回
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。
診斷
當 SQLExtendedFetch 傳回SQL_ERROR或SQL_SUCCESS_WITH_INFO時,可以藉由呼叫 SQLError 來取得相關聯的 SQLSTATE 值。 下表列出 SQLExtendedFetch 通常傳回的 SQLSTATE 值,並在此函式的內容中說明每個值;表示法 “(DM)” 在驅動程式管理員傳回的 SQLSTATE 描述之前。 除非另有說明,否則與每個 SQLSTATE 值相關聯的傳回碼會SQL_ERROR。 如果在單一數據行上發生錯誤,可以使用 SQL_DIAG_COLUMN_NUMBER 的 DiagIdentifier 呼叫 SQLGetDiagField,以判斷發生錯誤的數據行;而且可以使用 SQL_DIAG_ROW_NUMBER 的 DiagIdentifier 呼叫 SQLGetDiagField,以判斷包含該數據行的數據列。
SQLSTATE | 錯誤 | 描述 |
---|---|---|
01000 | 一般警告 | 驅動程式特定的資訊訊息。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
01004 | 字串數據,右截斷 | 針對數據行傳回的字串或二進位數據,導致截斷非空白字元或非 NULL 二進位數據。 如果它是字串值,則會將其右截斷。 如果是數值,則會截斷數位的小數部分。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
01S01 | 數據列中的錯誤 | 擷取一或多個數據列時發生錯誤。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
01S06 | 嘗試在結果集傳回第一個數據列集之前擷取 | 當目前位置超出第一個數據列時,要求的數據列集會重迭結果集的開始,而且 FetchOrientation 已SQL_PRIOR或 FetchOrientation 已SQL_RELATIVE負的 FetchOffset,其絕對值小於或等於目前的SQL_ROWSET_SIZE。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
01S07 | 小數截斷 | 針對數據行傳回的數據已截斷。 針對數值數據類型,數位的小數部分已截斷。 針對包含時間元件的 time、timestamp 和 interval 數據類型,時間的小數部分已截斷。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
07006 | 受限制的數據類型屬性違規 | 數據值無法轉換成 SQLBindCol 中 TargetType 所指定的 C 數據類型。 |
07009 | 無效的描述元索引 | 數據行 0 與 SQLBindCol 系結,且 SQL_ATTR_USE_BOOKMARKS 語句屬性設定為 SQL_UB_OFF。 |
08S01 | 通訊連結失敗 | 驅動程式與驅動程式連線的數據源之間的通訊連結在函式完成處理之前失敗。 |
22002 | 需要指標變數,但未提供 | NULL 數據擷取到 SQLBindCol 所設定StrLen_or_IndPtr為 Null 指標的數據行。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
22003 | 超出範圍的數值 | 傳回一或多個數據行的數值(作為數值或字串),會導致截斷數位的整個(而不是小數部分)。 (函式會傳回SQL_SUCCESS_WITH_INFO。) 如需詳細資訊,請參閱 附錄 D:數據類型中的間隔和數值數據類型 指導方針。 |
22007 | 無效的日期時間格式 | 結果集中的字元數據行已系結至日期、時間或時間戳 C 結構,而數據行中的值分別為無效的日期、時間或時間戳。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
22012 | 除以零 | 傳回算術表達式的值,導致除以零。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
22015 | 間隔欄位溢位 | 從確切的數值或間隔 SQL 類型指派給間隔 C 類型會導致前置欄位中的有效位數遺失。 將數據擷取至間隔 C 類型時,間隔 C 類型中沒有 SQL 類型的值表示法。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
22018 | 轉換規格的字元值無效 | C 類型是精確或近似數值、日期時間或間隔數據類型;數據行的 SQL 類型是字元數據類型;和數據行中的值不是系結 C 型別的有效常值。 (函式會傳回SQL_SUCCESS_WITH_INFO。) |
24000 | 無效的數據指標狀態 | StatementHandle 處於執行狀態,但沒有結果集與 StatementHandle 相關聯。 |
HY000 | 一般錯誤 | 發生錯誤,其中沒有特定的 SQLSTATE,也沒有定義任何實作特定的 SQLSTATE。 *MessageText 緩衝區中 SQLError 傳回的錯誤訊息描述錯誤及其原因。 |
HY001 | 記憶體配置錯誤 | 驅動程式無法配置支援執行或完成函式所需的記憶體。 |
HY008 | 作業已取消 | 已針對 StatementHandle 啟用異步處理。 已呼叫函式,並在完成執行之前,在 StatementHandle 上呼叫 SQLCancel 或 SQLCancelHandle,然後在 StatementHandle 上再次呼叫函式。 呼叫函式,並在完成執行之前,從多線程應用程式中的不同線程呼叫語句Handle 或 SQLCancelHandle。 |
HY010 | 函式順序錯誤 | (DM) 已針對與 StatementHandle 相關聯的連接句柄呼叫異步執行函式。 呼叫 SQLExtendedFetch 函式時,這個異步函式仍在執行中。 (DM) 已針對 StatementHandle 呼叫 SQLExecute、SQLExecDirect 或 SQLMoreResults,並傳回SQL_PARAM_DATA_AVAILABLE。 在擷取所有數據流參數的數據之前,會呼叫此函式。 (DM) 指定的 StatementHandle 未處於執行狀態。 未先呼叫 SQLExecDirect、SQLExecute 或目錄函式,就會呼叫函式。 (DM) 呼叫 StatementHandle 的異步執行函式(而非此函式),並在呼叫此函式時仍在執行中。 (DM) 已針對 StatementHandle 呼叫 SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos,並傳回SQL_NEED_DATA。 在針對所有數據執行中參數或數據行傳送數據之前,會呼叫此函式。 (DM) 在呼叫 SQLFetch 或 SQLFetchScroll 之後,以及使用 SQL_CLOSE 選項呼叫 SQLFreeStmt 之前,已針對 StatementHandle 呼叫 SQLExtendedFetch。 (DM) SQLBulkOperations 在呼叫 SQLFetch、SQLFetchScroll 或 SQLExtendedFetch 之前呼叫語句,然後在使用 SQL_CLOSE 選項呼叫 SQLFreeStmt 之前呼叫 SQLExtendedFetch。 |
HY013 | 記憶體管理錯誤 | 無法處理函式呼叫,因為基礎記憶體物件無法存取,可能是因為記憶體不足的情況。 |
HY106 | 擷取超出範圍的類型 | (DM) 為自變數 FetchOrientation 指定的值無效。 (請參閱“批注”。) fetchOrientation 自變數已SQL_FETCH_BOOKMARK,且 SQL_ATTR_USE_BOOKMARKS 語句屬性設定為 SQL_UB_OFF。 SQL_CURSOR_TYPE語句選項的值是SQL_CURSOR_FORWARD_ONLY,而且自變數 FetchOrientation 的值並未SQL_FETCH_NEXT。 fetchOrientation 自變數已SQL_FETCH_RESUME。 |
HY107 | 超出範圍的數據列值 | 使用 SQL_CURSOR_TYPE 語句選項指定的值是SQL_CURSOR_KEYSET_DRIVEN,但以 SQL_KEYSET_SIZE 語句屬性指定的值大於0,而且小於使用 SQL_ROWSET_SIZE語句屬性指定的值。 |
HY111 | 無效的書籤值 | 自變數 FetchOrientation 已SQL_FETCH_BOOKMARK,而且 FetchOffset 自變數中指定的書籤無效。 |
HY117 | 聯機因為未知的交易狀態而暫停。 只允許中斷連線和唯讀函式。 | (DM) 如需暫停狀態的詳細資訊,請參閱 SQLEndTran 函式。 |
HYC00 | 未實作選擇性功能 | 驅動程式或數據源不支援指定的擷取類型。 驅動程式或數據源不支援由 SQLBindCol 中 TargetType 與對應數據行的 SQL 資料類型組合所指定的轉換。 只有當數據行的 SQL 資料類型對應至驅動程式特定的 SQL 資料類型時,才會發生此錯誤。 |
HYT00 | 逾時已超過 | 數據源傳回結果集之前,查詢逾時期限已過期。 逾時期間是透過 SQLSetStmtOption 設定,SQL_QUERY_TIMEOUT。 |
HYT01 | 已超過連線逾時 | 在數據源回應要求之前,連線逾時期限已過期。 線上逾時期間是透過 SQLSetConnectAttr 來設定,SQL_ATTR_CONNECTION_TIMEOUT。 |
IM001 | 驅動程式不支援此函式 | (DM) 與 StatementHandle 相關聯的驅動程式不支援 函式。 |
註解
SQLExtendedFetch 的行為與 SQLFetchScroll 的行為相同,但有下列例外狀況:
SQLExtendedFetch 和 SQLFetchScroll 使用不同的方法來傳回所擷取的數據列數目。 SQLExtendedFetch 會傳回 *RowCountPtr 中撷取的數據列數目; SQLFetchScroll 會傳回直接擷取到SQL_ATTR_ROWS_FETCHED_PTR所指向之緩衝區的數據列數目。 如需詳細資訊,請參閱 RowCountPtr 自變數。
SQLExtendedFetch 和 SQLFetchScroll 會傳回不同數位中每個數據列的狀態。 如需詳細資訊,請參閱 RowStatusArray 自變數。
當 FetchOrientation SQL_FETCH_BOOKMARK時,SQLExtendedFetch 和 SQLFetchScroll 使用不同的方法來擷取書籤。 SQLExtendedFetch 不支援可變長度書籤,或從書籤擷取 0 以外的位移擷取數據列集。 如需詳細資訊,請參閱 FetchOffset 自變數。
SQLExtendedFetch 和 SQLFetchScroll 使用不同的數據列集大小。 SQLExtendedFetch 會使用 SQL_ROWSET_SIZE 語句屬性的值,而 SQLFetchScroll 會使用 SQL_ATTR_ROW_ARRAY_SIZE 語句屬性的值。
SQLExtendedFetch 的錯誤處理語意與 SQLFetchScroll 稍有不同。 如需詳細資訊,請參閱 SQLFetchScroll 的一節中的。
SQLExtendedFetch 不支持系結位移(SQL_ATTR_ROW_BIND_OFFSET_PTR語句屬性)。
對 SQLExtendedFetch 的呼叫無法與對 SQLFetch 或 SQLFetchScroll 的呼叫混合,而且如果在呼叫任何提取函式之前呼叫 SQLBulkOperations,則必須先關閉並重新開啟數據指標,才能呼叫 SQLExtendedFetch。 也就是說, SQLExtendedFetch 只能在語句狀態 S7 中呼叫。 如需詳細資訊,請參閱 附錄 B:ODBC 狀態轉換數據表中的語句轉換 。
當應用程式在使用 ODBC 2*.x* 驅動程式時呼叫 SQLFetchScroll 時,驅動程式管理員會將此呼叫對應至 SQLExtendedFetch。 如需詳細資訊,請參閱 SQLFetchScroll 和 SQLFetchScroll 中的 ODBC 2*.x* 驅動程式。
在 ODBC 2*.x*中, 呼叫 SQLExtendedFetch 來擷取多個數據列,並 呼叫 SQLFetch 來擷取單一數據列。 另一方面,在 ODBC 3*.x*中, 可以呼叫 SQLFetch 來擷取 多個數據列。
相關函數
如需下列資訊 | 請參閱 |
---|---|
將緩衝區系結至結果集中的數據行 | SQLBindCol 函式 |
執行大量插入、更新或刪除作業 | SQLBulkOperations 函式 |
取消語句處理 | SQLCancel 函式 |
傳回結果集中數據行的相關信息 | SQLDescribeCol 函式 |
執行 SQL 語句 | SQLExecDirect 函式 |
執行備妥的 SQL 語句 | SQLExecute 函式 |
傳回結果集數據行的數目 | SQLNumResultCols 函式 |
定位數據指標、重新整理數據列集中的數據,或更新或刪除結果集中的數據 | SQLSetPos 函式 |
設定語句屬性 | SQLSetStmtAttr 函式 |