共用方式為


TN042:ODBC 驅動程式開發人員建議

備註

自第一次包含在在線文件中以來,尚未更新下列技術附注。 因此,某些程式和主題可能已過期或不正確。 如需最新信息,建議您搜尋在線檔索引中感興趣的主題。

此附註說明 ODBC 驅動程式寫入器的指導方針。 它概述 MFC 資料庫類別所建立之 ODBC 功能的一般需求和假設,以及各種預期的語意詳細數據。 詳述支援三 CRecordset 種 Open 模式的驅動程式所需功能(forwardOnly快照動態集)。

ODBC 的游標庫

MFC Database 類別向用戶呈現功能,在許多情況下超過大多數層級 1 ODBC 驅動程式所提供的功能。 幸運的是,ODBC 的數據指標連結庫會在資料庫類別與驅動程式之間分層,並會自動提供這項額外的功能。

例如,大部分的 1.0 驅動程式都不支援向後捲動。 游標庫可以偵測到此狀況,並且會快取來自驅動程序的數據列,然後在 SQLExtendedFetch 中的 FETCH_PREV 呼叫上按需求提供數據列。

游標函式庫相依性的另一個重要範例是定位更新。 大部分 1.0 驅動程式也沒有定位更新操作,但游標庫會產生更新語句,根據目前的快取數據值或快取的時間戳值,來識別數據來源上的目標數據列。

類別庫絕不會使用多個數據列集。 因此,少數 SQLSetPos 語句一律會套用至數據列集的第 1 列。

CDatabases

每個 CDatabase 都會配置一個單一的 HDBC。 如果使用 CDatabaseExecuteSQL 函式,則會暫時配置一個 HSTMT。因此,如果需要多個 CDatabase,則每個 HENV 必須支援多個 HDBC

資料庫類別需要游標程式庫。 這體現於SQLSetConnections呼叫SQL_ODBC_CURSORSSQL_CUR_USE_ODBC

SQLDriverConnect 使用 SQL_DRIVER_COMPLETE 來建立與數據源的連接 CDatabase::Open

驅動程式必須支援 SQLGetInfo SQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM

為了讓 和 其相依記錄集支援 CDatabase 交易, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIORSQL_CURSOR_ROLLBACK_BEHAVIOR 必須有 SQL_CR_PRESERVE。 否則,嘗試進行的交易控制將被忽略。

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY 必須被支援。 如果傳回 「Y」,則不會對數據源執行任何更新作業。

CDatabase如果 已開啟 ReadOnly,嘗試將數據源設為唯讀,則會使用 SQLSetConnectOption SQL_ACCESS_MODESQL_MODE_READ_ONLY

如果標識元需要加上引號,則驅動程式應該從 SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR 呼叫中傳回這項資訊。

為了進行偵錯,從驅動程式擷取 SQLGetInfo SQL_DBMS_VERSQL_DBMS_NAME

SQLSetStmtOption SQL_QUERY_TIMEOUTSQL_ASYNC_ENABLE可能會在CDatabaseHDBC上呼叫。

SQLError 可以在任何或全部參數皆為 NULL 时呼叫。

當然,SQLAllocEnvSQLAllocConnectSQLDisconnectSQLFreeConnect必須支援。

ExecuteSQL

除了設定和釋放暫存 HSTMT 之外,ExecuteSQL呼叫SQLExecDirectSQLFetchSQLNumResultColSQLMoreResultsSQLCancel 可以在 HSTMT 上呼叫。

獲取資料庫名稱

SQLGetInfo SQL_DATABASE_NAME 會被叫到。

BeginTrans、CommitTrans、Rollback

SQLSetConnectOption SQL_AUTOCOMMITSQLTransact SQL_COMMIT,如果發出交易要求,則會呼叫 SQL_ROLLBACKSQL_AUTOCOMMIT

CRecordsets

SQLAllocStmtSQLPrepareSQLExecute(針對OpenRequery),SQLExecDirect(針對更新作業),SQLFreeStmt必須支援。 SQLNumResultColsSQLDescribeCol 會在各種時間呼叫結果集。

SQLSetParam 用於係結參數數據和 DATA_AT_EXEC 功能。

SQLBindCol 會廣泛使用 來向 ODBC 註冊輸出數據行數據儲存位置。

SQLGetData 個呼叫可用來擷 取SQL_LONG_VARCHARSQL_LONG_VARBINARY 數據。 第一次呼叫試圖透過以 cbMaxValue 為 0 呼叫SQLGetData,但使用有效的 pcbValue,來找出欄位值的總長度。 如果pcbValue持有SQL_NO_TOTAL,則會擲回例外狀況。 否則,會配置 HGLOBAL ,併發出另一個 SQLGetData 呼叫來擷取整個結果。

更新

如果要求悲觀鎖定,SQLGetInfo SQL_LOCK_TYPES 將會被查詢。 如果不支援 SQL_LCK_EXCLUSIVE ,則會擲回例外狀況。

嘗試更新 CRecordsetsnapshotdynaset) 會導致配置第二個 HSTMT 。 對於不支援第二個 HSTMT 的驅動程式,游標庫將模擬此功能。 不幸的是,這表示有時候可能需要在處理第二個 HSTMT 的要求之前,強制第一個 HSTMT 上的目前查詢完成。

SQLFreeStmt SQL_CLOSESQL_RESET_PARAMS 將在更新作業期間被呼叫 SQLGetCursorName

如果 outputColumns 中有 CLongBinarys,則必須支援 ODBC 的DATA_AT_EXEC功能。 這包括從SQLExecDirectSQLParamData傳回SQLPutData

SQLRowCount 在執行 之後呼叫 ,以確認 只有1筆記錄已由 SQLExecDirect更新。

僅向前游標

僅需要 SQLFetch 來執行 Move 作業。 請注意 forwardOnly 游標不支援更新。

快照游標

快照功能需要 SQLExtendedFetch 支援。 如上所述,ODBC 遊標庫會偵測驅動程式不支援 SQLExtendedFetch 的情況,並自行提供必要的支援。

SQLGetInfoSQL_SCROLL_OPTIONS 必須支援 SQL_SO_STATIC

動態集合游標

以下是開啟動態集所需的最低支援:

SQLGetInfoSQL_ODBC_VER 必須傳回 > “01”。

SQLGetInfoSQL_SCROLL_OPTIONS 必須支援 SQL_SO_KEYSET_DRIVEN

SQLGetInfoSQL_ROW_UPDATES 必須傳回 「Y」。。

SQLGetInfoSQL_POSITIONED_UPDATES 必須支援 SQL_PS_POSITIONED_DELETESQL_PS_POSITIONED_UPDATE

此外,如果要求悲觀鎖定,則會進行呼叫到 SQLSetPos,使用 irow 1、fRefresh FALSE 和 fLock SQL_LCK_EXCLUSIVE

另請參閱

依編號的技術注意事項
依類別排序的技術注意事項