分享方式:


應用程式回溯相容性的取代函式對應

透過 ODBC 3.x 驅動程式管理員執行的 ODBC 3.x 應用程式,只要未使用任何新功能,即可使用 ODBC 2.x 驅動程式。 不過,重複的功能和行為變更都會影響 ODBC 3.x 應用程式在 ODBC 2.x 驅動程式上的運作方式。 使用 ODBC 2.x 驅動程式時,驅動程式管理員會將下列已取代一個或多個 ODBC 2.x 函式的 ODBC 3.x 函式對應至對應的 ODBC 2.x 函式。

ODBC 3.x 函式 ODBC 2.x 函式
SQLAllocHandle SQLAllocEnvSQLAllocConnectSQLAllocStmt
SQLBulkOperations SQLSetPos
SQLColAttribute SQLColAttributes
SQLEndTran SQLTransact
SQLFetch SQLExtendedFetch
SQLFetchScroll SQLExtendedFetch
SQLFreeHandle SQLFreeEnvSQLFreeConnectSQLFreeStmt
SQLGetConnectAttr SQLGetConnectOption
SQLGetDiagRec SQLError
SQLGetStmtAttr SQLGetStmtOption[1]
SQLSetConnectAttr SQLSetConnectOption
SQLSetStmtAttr SQLSetStmtOption[1]

[1] 可能也會採取其他動作,視要求的屬性而定。

SQLAllocHandle

驅動程式管理員會視需要,將此對應至 SQLAllocEnvSQLAllocConnectSQLAllocStmt。 下列對 SQLAllocHandle 進行的呼叫:

SQLAllocHandle(HandleType, InputHandle, OutputHandlePtr);  

會導致驅動程式管理員執行下列對應 (概念性,未進行錯誤檢查):

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLAllocEnv(OutputHandlePtr));  
   case SQL_HANDLE_DBC: return (SQLAllocConnect (InputHandle, OutputHandlePtr));  
   case SQL_HANDLE_STMT: return (SQLAllocStmt (InputHandle, OutputHandlePtr));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLBulkOperations

驅動程式管理員會將此對應至 SQLSetPos。 下列對 SQLBulkOperations 進行的呼叫:

SQLBulkOperations(hstmt, Operation);  

將會產生下列步驟序列:

  1. 如果運算引數為 SQL_ADD,則驅動程式管理員會呼叫 SQLSetPos,如下所示:

    SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);  
    
  2. 如果運算引數非 SQL_ADD,則驅動程式會傳回 SQLSTATE HY092 (無效的屬性/選項識別碼)。

  3. 如果應用程式嘗試在呼叫 SQLFetchSQLFetchScrollSQLBulkOperations 之間變更 SQL_ATTR_ROW_STATUS_PTR,驅動程式管理員將傳回 SQLSTATE HY011 (現在無法設定屬性)。

  4. 如果運算引數為 SQL_ADD,則應用程式必須呼叫 SQLBindCol,才能繫結要插入的資料。 無法呼叫 SQLSetDescFieldSQLSetDescRec 來繫結要插入的資料。

  5. 如果運算引數為 SQL_ADD,且要插入的資料列數目與目前資料列集大小不同,則必須呼叫 SQLSetStmtAttr,以將SQL_ATTR_ROW_ARRAY_SIZE 陳述式屬性設定為呼叫 SQLBulkOperations 之前要插入的資料列數目。 若要還原至先前的資料列集大小,應用程式必須在呼叫 SQLFetchSQLFetchScrollSQLSetPos 之前設定 SQL_ATTR_ROW_ARRAY_SIZE 陳述式屬性。

SQLColAttribute

驅動程式管理員會將此對應至 SQLColAttributes。 下列對 SQLColAttribute 進行的呼叫:

SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  

將會產生下列步驟序列:

  1. 若 FieldIdentifier 為下列其中一項:

    SQL_DESC_PRECISION、SQL_DESC_SCALE、SQL_DESC_LENGTH、SQL_DESC_OCTET_LENGTH、SQL_DESC_UNNAMED、SQL_DESC_BASE_COLUMN_NAME、SQL_DESC_LITERAL_PREFIX、SQL_DESC_LITERAL_SUFFIX 或 SQL_DESC_LOCAL_TYPE_NAME

    驅動程式管理員會傳回 SQL_ERROR 和 SQLSTATE HY091 (無效的描述項欄位識別碼)。 此區段沒有其他適用的規則。

  2. 驅動程式管理員會分別將 SQL_COLUMN_COUNT、SQL_COLUMN_NAME 或 SQL_COLUMN_NullABLE 對應至 SQL_DESC_COUNT、SQL_DESC_NAME 或 SQL_DESC_NullABLE。 (ODBC 2.x 驅動程式只需要支援SQL_COLUMN_COUNT、SQL_COLUMN_NAME 和SQL_COLUMN_NullABLE,而不需支援 SQL_DESC_COUNT、SQL_DESC_NAME 和 SQL_DESC_NullABLE.) 對 SQLColAttribute 的呼叫會對應至:

    SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  
    
  3. 所有其他 FieldIdentifier 值都會傳遞至驅動程式,且 SQLColAttribute 會對應至 SQLColAttributes,如先前所示。

  4. 如果 BufferLength 小於 0,則驅動程式管理員會傳回 SQL_ERROR 和 SQLSTATE HY090 (無效的字串或緩衝區長度)。 此區段沒有其他適用的規則。

  5. 如果 FieldIdentifier 是 SQL_DESC_CONCISE_TYPE,且傳回的類型是精簡的日期時間資料類型,則驅動程式管理員會對應日期、時間和時間戳記代碼的傳回值。

  6. 驅動程式管理員會執行必要的檢查,確認是否需要引發 SQLSTATE HY010 (函式序列錯誤)。 如果需要,驅動程式管理員會傳回 SQL_ERROR 和 SQLSTATE HY010 (函式序列錯誤)。 此區段沒有其他適用的規則。

SQLEndTran

驅動程式管理員會將此對應至 SQLTransact。 下列對 SQLEndTran 進行的呼叫:

SQLEndTran(HandleType, Handle, CompletionType);  

會導致驅動程式管理員執行下列對應 (概念性,未進行錯誤檢查):

switch (HandleType) {  
   case SQL_HANDLE_ENV:return(SQLTransact(Handle, SQL_NULL_HDBC, CompletionType));  
   case SQL_HANDLE_DBC:return(SQLTransact(SQL_NULL_HENV, Handle, CompletionType);  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLFetch

驅動程式管理員會將此對應至 SQLExtendedFetch,其中 FetchOrientation 引數為 SQL_FETCH_NEXT。 下列對 SQLFetch 進行的呼叫:

SQLFetch (StatementHandle);  

會導致驅動程式管理員呼叫 SQLExtendedFetch,如下所示:

rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, &RowCount, RowStatusArray);  

在此呼叫中,pcRow 引數會設為應用程式透過呼叫 SQLSetStmtAttr 對 SQL_ATTR_ROWS_FETCHED_PTR 陳述式屬性所設的值。

注意

當應用程式呼叫 SQLSetStmtAttr 來設定 SQL_ATTR_ROW_STATUS_PTR 指向狀態陣列時,驅動程式管理員會快取該指標。 RowStatusArray 可以等於 null 指標。

如果驅動程式不支援 SQLExtendedFetch,且已載入資料指標程式庫,則驅動程式管理員會使用資料指標程式庫的 SQLExtendedFetch,將 SQLFetch 對應至 SQLExtendedFetch。 如果驅動程式不支援 SQLExtendedFetch,且未載入資料指標程式庫,則驅動程式管理員會將呼叫傳遞至 SQLFetch 再到驅動程式。 如果應用程式呼叫 SQLSetStmtAttr 以設定 SQL_ATTR_ROW_STATUS_PTR,則驅動程式管理員會確保將陣列填妥。 如果應用程式呼叫 SQLSetStmtAttr 以設定 SQL_ATTR_ROWS_FETCHED_PTR,則驅動程式管理員會將此欄位設為 1。

SQLFetchScroll

驅動程式管理員會將此對應至 SQLExtendedFetch。 下列對 SQLFetchScroll 進行的呼叫:

SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);  

將會產生下列步驟序列:

  1. 當應用程式呼叫 SQLSetStmtAttr 以設定 SQL_ATTR_ROW_STATUS_PTR (且會設定 IRD中 SQL_DESC_ARRAY_STATUS_PTR 欄位) 指向狀態陣列時,驅動程式管理員會快取此指標。 設定此指標為 RowStatusArray;或讓 RowStatusArray 等於 null 指標。 如果將 RowStatusArray 引數設定為 null 指標,驅動程式管理員就會產生資料列狀態陣列。

  2. 如果 FetchOrientation 不是 SQL_FETCH_NEXT、SQL_FETCH_PRIOR、SQL_FETCH_ABSOLUTE、SQL_FETCH_RELATIVE、SQL_FETCH_FIRST、SQL_FETCH_LAST 或SQL_FETCH_BOOKMARK 的其中之一,則驅動程式管理員會傳回 SQL_ERROR和 SQLSTATE HY106 (擷取類型超出範圍)。 此區段沒有其他適用的規則。

  3. 案例:

  • 如果 FetchOrientation 等於 SQL_FETCH_BOOKMARK,則:

    • 如果稍早已呼叫 SQLSetStmtAttr 來設定 SQL_ATTR_FETCH_BOOKMARK_PTR 的值,請將 Bmk 設為對指標 SQL_DESC_FETCH_BOOKMARK_PTR 取值所取得的值。

    • 否則,請使用 SQLSTATE HY111 傳回 SQL_ERROR (無效書籤值)。 此區段沒有其他適用的規則。

    驅動程式管理員現在會呼叫 SQLExtendedFetch,如下所示:

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);  
    
  • 否則,驅動程式管理員會呼叫 SQLExtendedFetch,如下所示:

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, pcRow, RowStatusArray);  
    

    在這些呼叫中,pcRow 引數會設為應用程式透過呼叫 SQLSetStmtAttr 將 SQL_ATTR_ROWS_FETCHED_PTR 陳述式屬性設為的值。

  • SQL_ATTR_ROW_ARRAY_SIZE 已對應至 SQL_ROWSET_SIZE。

  • 如果 rc 等於 SQL_SUCCESS 或 SQL_SUCCESS_WITH_INFO,而且 FetchOrientation 等於 SQL_FETCH_BOOKMARK,且 FetchOffset 不等於 0,則驅動程式管理員會發佈警告 SQLSTATE 01S10 (嘗試依書籤位移進行擷取、忽略位移值),並傳回 SQL_SUCCESS_WITH_INFO。

SQLFreeHandle

驅動程式管理員會視需要將此對應至 SQLFreeEnvSQLFreeConnectSQLFreeStmt。 下列對 SQLFreeHandle 進行的呼叫:

SQLFreeHandle(HandleType, Handle);  

會導致驅動程式管理員執行下列對應 (概念性,未進行錯誤檢查):

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLFreeEnv(Handle));  
   case SQL_HANDLE_DBC: return (SQLFreeConnect(Handle));  
   case SQL_HANDLE_STMT: return (SQLFreeStmt(Handle, SQL_DROP));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLGetConnectAttr

驅動程式管理員會將此對應至 SQLGetConnectOption。 下列對 SQLGetConnectAttr 進行的呼叫:

SQLGetConnectAttr(ConnectionHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

將會產生下列步驟序列:

  1. 如果 Attribute 不是驅動程式定義的連接或陳述式屬性,而且不是 ODBC 2.x 中定義的屬性,則驅動程式管理員會傳回 SQL_ERROR 與 SQLSTATE HY092 (無效的屬性/選項識別碼)。 此區段中沒有其他規則適用。

  2. 如果 Attribute 等於 SQL_ATTR_AUTO_IPD 或 SQL_ATTR_METADATA_ID,則驅動程式管理員會傳回 SQL_ERROR 與 SQLSTATE HY092 (無效的屬性/選項識別碼)。

  3. 驅動程式管理員會執行必要的檢查,以確認是否需要引發 SQLSTATE 08003 (未開放連線) 或 SQLSTATE HY010 (函式序列錯誤)。 如果需要,驅動程式管理員會傳回 SQL_ERROR 並發佈適當的錯誤訊息。 此區段沒有其他適用的規則。

  4. 驅動程式管理員會呼叫 SQLGetConnectOption,如下所示:

    SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);  
    

    請注意,會忽略 BufferLength 和 StringLengthPtr。

SQLGetData

當使用 ODBC 3.x 應用程式搭配 ODBC 2.x 驅動程式,並呼叫 ColumnNumber 引數等於 0 的 SQLGetData 時,ODBC 3.x 驅動程式管理員會將此對應至 SQLGetStmtOption 的呼叫,並將 Option 屬性設定為 SQL_GET_BOOKMARK。

SQLGetStmtAttr

驅動程式管理員會將此對應至 SQLGetStmtOption。 下列對 SQLGetStmtAttr 進行的呼叫:

SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

將會產生下列步驟序列:

  1. 如果 Attribute 不是驅動程式定義的連接或陳述式屬性,而且不是 ODBC 2.x 中定義的屬性,則驅動程式管理員會傳回 SQL_ERROR 與 SQLSTATE HY092 (無效的屬性/選項識別碼)。 此區段中沒有其他規則適用。

  2. 如果 Attribute 是下列其中一項:

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    驅動程式管理員會傳回 SQLSTATE HY092 (無效的屬性/選項識別碼) 和 SQL_ERROR。 此區段沒有其他適用的規則。

  3. 驅動程式管理員會執行必要的檢查,確認是否需要引發 SQLSTATE HY010 (函式序列錯誤)。 如果需要,驅動程式管理員會傳回 SQL_ERROR 和 SQLSTATE HY010 (函式序列錯誤)。 此區段沒有其他適用的規則。

  4. 如果 Attribute 等於 SQL_ATTR_ROWS_FETCHED_PTR,則驅動程式管理員會將指標傳回內部驅動程式管理員變數 cRow,而該變數已使用於或即將使用於對 SQLExtendedFetch 的呼叫中。 此區段沒有其他適用的規則。

  5. 如果 Attribute 等於 SQL_DESC_FETCH_BOOKMARK_PTR,則驅動程式管理員會傳回在對 SQLSetStmtAttr 呼叫期間所快取的適當指標。

  6. 如果 Attribute 等於 SQL_ATTR_ROW_STATUS_PTR,則驅動程式管理員會傳回在對 SQLSetStmtAttr 呼叫期間所快取的適當指標。

  7. 驅動程式管理員會呼叫 SQLGetStmtOption,如下所示:

    SQLGetStmtOption (hstmt, fOption, pvParam);  
    

    其中 hstmt、fOption 和 pvParam 會分別設為 StatementHandle、Attribute 和 ValuePtr 的值。 會忽略 BufferLength 和 StringLengthPtr。

SQLSetConnectAttr

驅動程式管理員會將此對應至 SQLSetConnectOption。 下列對 SQLSetConnectAttr 進行的呼叫:

SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);  

將會產生下列步驟序列:

  1. 如果 Attribute 不是驅動程式定義的連接或陳述式屬性,而且不是 ODBC 2.x 中定義的屬性,則驅動程式管理員會傳回 SQL_ERROR 與 SQLSTATE HY092 (無效的屬性/選項識別碼)。 此區段中沒有其他規則適用。

  2. 如果 Attribute 等於 SQL_ATTR_AUTO_IPD,則驅動程式管理員會傳回 SQL_ERROR 與 SQLSTATE HY092 (無效的屬性/選項識別碼)。

  3. 驅動程式管理員會執行必要的檢查,以確認是否需要引發 SQLSTATE 08003 (未開放連線) 或 SQLSTATE HY010 (函式序列錯誤)。 如果需要引發其中一個錯誤,則驅動程式管理員會傳回 SQL_ERROR 並發佈適當的錯誤訊息。 此區段沒有其他適用的規則。

  4. 驅動程式管理員會呼叫 SQLSetConnectOption,如下所示:

    SQLSetConnectOption (hdbc, fOption, vParam);  
    

    其中 hdbc、fOption 和 vParam 會分別設為 ConnectionHandle、Attribute 和 ValuePtr 的值。 會忽略 StringLengthPtr。

注意

在連接層級上設定陳述式屬性的功能已被取代。 ODBC 3.x 應用程式一律不應在連接層級上設定陳述式屬性。

SQLSetStmtAttr

驅動程式管理員會將此對應至 SQLSetStmtOption。 下列對 SQLSetStmtAttr 進行的呼叫:

SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);  

將會產生下列步驟序列:

  1. 如果 Attribute 不是驅動程式定義的連接或陳述式屬性,而且不是 ODBC 2.x 中定義的屬性,則驅動程式管理員會傳回 SQL_ERROR 與 SQLSTATE HY092 (無效的屬性/選項識別碼)。 此區段中沒有其他規則適用。

  2. 如果 Attribute 是下列其中一項:

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    驅動程式管理員會傳回 SQLSTATE HY092 (無效的屬性/選項識別碼) 和 SQL_ERROR。 此區段沒有其他適用的規則。

  3. 驅動程式管理員會執行必要的檢查,以確認是否需要引發 SQLSTATE HY010 (函式序列錯誤)。 如果需要,驅動程式管理員會傳回 SQL_ERROR 和 SQLSTATE HY010 (函式序列錯誤)。 此區段沒有其他適用的規則。

  4. 如果 Attribute 等於 SQL_ATTR_PARAMSET_SIZE 或 SQL_ATTR_PARAMS_PROCESSED_PTR,請參閱本主題後一節。 此區段沒有其他適用的規則。

  5. 如果 Attribute 等於 SQL_ATTR_ROWS_FETCHED_PTR,則驅動程式管理員會快取指標值,以供稍後與 SQLFetchScroll 搭配使用。

  6. 如果 Attribute 等於 SQL_ATTR_ROW_STATUS_PTR,則驅動程式管理員會快取指標值,以供稍後與 SQLFetchScrollSQLSetPos 或搭配使用。 此區段沒有其他適用的規則。

  7. 如果 Attribute 等於 SQL_ATTR_FETCH_BOOKMARK_PTR,則驅動程式管理員會快取 ValuePtr,並在稍後呼叫 SQLFetchScroll 時使用快取的值。 此區段沒有其他適用的規則。

  8. 驅動程式管理員會呼叫 SQLSetStmtOption,如下所示:

    SQLSetStmtOption (hstmt, fOption, vParam);  
    

    其中 hstmt、fOption 和 vParam 會分別設為 StatementHandle、Attribute 和 ValuePtr 的值。 會忽略 StringLength 引數。

    如果 ODBC 2.x 驅動程式支援字元字串、驅動程式專屬的陳述式選項,則 ODBC 3.x 應用程式應呼叫 SQLSetStmtOption 來設定這些選項。

處理參數陣列的對應

應用程式呼叫時:

SQLSetStmtAttr (StatementHandle, SQL_ATTR_PARAMSET_SIZE, Size, StringLength);  

驅動程式管理員呼叫時:

SQLParamOptions (StatementHandle, Size, &RowCount);  

驅動程式管理員稍後會在應用程式呼叫 SQLGetStmtAttr 擷取 SQL_ATTR_PARAMS_PROCESSED_PTR 時,傳回此變數的指標。 驅動程式管理員無法變更此內部變數,直到陳述式控制碼回復至已準備或已配置狀態為止。

即使尚未在 APD 中明確設定 SQL_DESC_ARRAY_SIZE 欄位,ODBC 3.x 應用程式仍可以呼叫 SQLGetStmtAttr 來取得 SQL_ATTR_PARAMS_PROCESSED_PTR 的值。 例如,如果應用程式具有一般常式,且會檢查 SQLExecute 傳回 SQL_NEED_DATA 時所處理的參數目前的「資料列」,就可能發生這種情況。 不論 SQL_DESC_ARRAY_SIZE 為 1 或大於 1,皆會叫用此常式。 若要考慮這個問題,驅動程式管理員必須定義此內部變數,不論應用程式是否已呼叫 SQLSetStmtAttr 以在 APD 中設定 SQL_DESC_ARRAY_SIZE 欄位。 如果未設定 SQL_DESC_ARRAY_SIZE,則驅動程式管理員必須確定從 SQLExecDirectSQLExecute 傳回之前,此變數包含 1 這個值。

錯誤處理

在 ODBC 3.x 中,呼叫 SQLFetchSQLFetchScroll 會在 IRD 中填入 SQL_DESC_ARRAY_STATUS_PTR,而指定診斷記錄的 SQL_DIAG_ROW_NUMBER 欄位包含此記錄相關資料列集中的資料列數目。 如此一來,應用程式就可以將錯誤訊息與指定的資料列位置相互關聯。

ODBC 2.x 驅動程式將無法提供這項功能。 不過會提供 SQLSTATE 01S01 的錯誤界限 (資料列錯誤)。 針對 ODBC 2.x 驅動程式執行時,使用 SQLFetchSQLFetchScroll 的 ODBC 3.x 應用程式必須注意此事實。 另請注意,這類應用程式將無法呼叫 SQLGetDiagField 來實際取得 SQL_DIAG_ROW_NUMBER 欄位。 搭配 ODBC 2.x 驅動程式使用的 ODBC 3.x 應用程式,只能使用 SQL_DIAG_MESSAGE_TEXT、SQL_DIAG_NATIVE、SQL_DIAG_RETURNCODE 或 SQL_DIAG_SQLSTATE 的 DiagIdentifier 引數呼叫 SQLGetDiagField。 ODBC 3.x 驅動程式管理員會在搭配使用 ODBC 2.x 驅動程式時維護診斷資料結構,但 ODBC 2.x 驅動程式只會傳回這四個欄位。

當 ODBC 2.x 應用程式搭配使用 ODBC 2.x 驅動程式時,如果某項作業可能會導致驅動程式管理員傳回多個錯誤,則 ODBC 3.x 驅動程式管理員可能會傳回不同的錯誤,而非 ODBC 2.x 驅動程式管理員。

書籤作業的對應

當 ODBC 3.x 應用程式搭配 ODBC 2.x 驅動程式執行書籤作業時,ODBC 3.x 驅動程式會執行下列對應。

SQLBindCol

ODBC 3.x 應用程式搭配 ODBC 2.x 驅動程式使用時,若呼叫 SQLBindCol 以繫結至資料行 0,且 fCType 等於 SQL_C_VARBOOKMARK 時,ODBC 3.x 驅動程式管理員會檢查 BufferLength 引數是否小於 4 或大於 4,如果是的話,會傳回 SQLSTATE HY090 (無效的字串或緩衝區長度)。 如果 BufferLength 引數等於 4,則驅動程式管理員會在將 fCType 取代為 SQL_C_BOOKMARK 之後,在驅動程式中呼叫 SQLBindCol。

SQLColAttribute

當 ODBC 3.x 應用程式搭配 ODBC 2.x 驅動程式使用時,若呼叫 SQLColAttribute 且 ColumnNumber 引數已設為 0,驅動程式管理員會傳回下表所列的 FieldIdentifier 值。

FieldIdentifier
SQL_DESC_AUTO_UNIQUE_VALUE SQL_FALSE
SQL_DESC_CASE_SENSITIVE SQL_FALSE
SQL_DESC_CATALOG_NAME "" (空字串)
SQL_DESC_CONCISE_TYPE SQL_BINARY
SQL_DESC_COUNT SQLNumResultCols 傳回的相同值
SQL_DESC_DATETIME_INTERVAL_CODE 0
SQL_DESC_DISPLAY_SIZE 8
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE
SQL_DESC_LABEL "" (空字串)
SQL_DESC_LENGTH 0
SQL_DESC_LITERAL_PREFIX "" (空字串)
SQL_DESC_LITERAL_SUFFIX "" (空字串)
SQL_DESC_LOCAL_TYPE_NAME "" (空字串)
SQL_DESC_NAME "" (空字串)
SQL_DESC_NULLABLE SQL_NO_NULLS
SQL_DESC_OCTET_LENGTH 4
SQL_DESC_PRECISION 4
SQL_DESC_SCALE 0
SQL_DESC_SCHEMA_NAME "" (空字串)
SQL_DESC_SEARCHABLE SQL_PRED_NONE
SQL_DESC_TABLE_NAME "" (空字串)
SQL_DESC_TYPE SQL_BINARY
SQL_DESC_TYPE_NAME "" (空字串)
SQL_DESC_UNNAMED SQL_UNNAMED
SQL_DESC_UNSIGNED SQL_FALSE
SQL_DESC_UPDATEABLE SQL_ATTR_READ_ONLY

SQLDescribeCol

當 ODBC 3.x 應用程式搭配 ODBC 2.x 驅動程式使用時,若呼叫 SQLDescribeCol 且 ColumnNumber 引數已設為 0,驅動程式管理員會傳回下表所列的值。

Buffer
ColumnName "" (空字串)
*NameLengthPtr 0
*DataTypePtr SQL_BINARY
*ColumnSizePtr 4
*DecimalDigitsPtr 0
*NullablePtr SQL_NO_NULLS

SQLGetData

當 ODBC 3.x 應用程式搭配 ODBC 2.x 驅動程式使用時,若對 SQLGetData 進行下列呼叫以擷取書籤:

SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)  

呼叫會對應至具有 SQL_GET_BOOKMARK 的 fOption 的 SQLGetStmtOption,如下所示:

SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)  

其中 hstmt 和 pvParam 分別設定為 StatementHandle 和 TargetValuePtr 中的值。 書籤會傳回至 pvParam (TargetValuePtr) 引數所指向的緩衝區中。 呼叫 SQLGetData 時,StrLen_or_IndPtr 引數所指向的緩衝區中的值會設為 4。

此對應必須考慮到在呼叫 SQLGetData 之前呼叫 SQLFetch,以及 ODBC 2.x 驅動程式不支援 SQLExtendedFetch 的情況。 在此情況下,SQLFetch 會傳遞至 ODBC 2.x 驅動程式,而在此情況下將不支援書籤擷取作業。

無法在 ODBC 2.x 驅動程式中多次呼叫 SQLGetData 來分段擷取書籤,因此將 BufferLength 引數設為小於 4,ColumnNumber 引數設為 0,並呼叫 SQLGetData 時,會傳回 SQLSTATE HY090 (無效的字串或緩衝區長度)。 不過,可以多次呼叫 SQLGetData,以擷取相同的書籤。

SQLSetStmtAttr

當 ODBC 3.x 應用程式搭配 ODBC 2.x 驅動程式使用時,若呼叫 SQLSetStmtAttr 將 SQL_ATTR_USE_BOOKMARKS 屬性設為 SQL_UB_VARIABLE,驅動程式管理員會將屬性設為基礎 ODBC 2.x 驅動程式中的 SQL_UB_ON。