備註
自第一次包含在在線文件中以來,尚未更新下列技術附注。 因此,某些程式和主題可能已過期或不正確。 如需最新信息,建議您搜尋在線檔索引中感興趣的主題。
此附註說明 ODBC 驅動程式寫入器的指導方針。 它概述 MFC 資料庫類別所建立之 ODBC 功能的一般需求和假設,以及各種預期的語意詳細數據。 詳述支援三 CRecordset
種 Open 模式的驅動程式所需功能(forwardOnly、快照 和 動態集)。
ODBC 的游標庫
MFC Database 類別向用戶呈現功能,在許多情況下超過大多數層級 1 ODBC 驅動程式所提供的功能。 幸運的是,ODBC 的數據指標連結庫會在資料庫類別與驅動程式之間分層,並會自動提供這項額外的功能。
例如,大部分的 1.0 驅動程式都不支援向後捲動。 游標庫可以偵測到此狀況,並且會快取來自驅動程序的數據列,然後在 SQLExtendedFetch
中的 FETCH_PREV 呼叫上按需求提供數據列。
游標函式庫相依性的另一個重要範例是定位更新。 大部分 1.0 驅動程式也沒有定位更新操作,但游標庫會產生更新語句,根據目前的快取數據值或快取的時間戳值,來識別數據來源上的目標數據列。
類別庫絕不會使用多個數據列集。 因此,少數 SQLSetPos
語句一律會套用至數據列集的第 1 列。
CDatabases
每個 CDatabase
都會配置一個單一的 HDBC。 如果使用 CDatabase
的 ExecuteSQL
函式,則會暫時配置一個 HSTMT。因此,如果需要多個 CDatabase
,則每個 HENV 必須支援多個 HDBC。
資料庫類別需要游標程式庫。 這體現於SQLSetConnections
呼叫SQL_ODBC_CURSORS、SQL_CUR_USE_ODBC。
SQLDriverConnect
使用 SQL_DRIVER_COMPLETE 來建立與數據源的連接 CDatabase::Open
。
驅動程式必須支援 SQLGetInfo SQL_ODBC_API_CONFORMANCE
>= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE
>= SQL_OSC_MINIMUM。
為了讓 和 其相依記錄集支援 CDatabase
交易, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR
且 SQL_CURSOR_ROLLBACK_BEHAVIOR 必須有 SQL_CR_PRESERVE。 否則,嘗試進行的交易控制將被忽略。
SQLGetInfo SQL_DATA_SOURCE_READ_ONLY
必須被支援。 如果傳回 「Y」,則不會對數據源執行任何更新作業。
CDatabase
如果 已開啟 ReadOnly,嘗試將數據源設為唯讀,則會使用 SQLSetConnectOption SQL_ACCESS_MODE
SQL_MODE_READ_ONLY。
如果標識元需要加上引號,則驅動程式應該從 SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR
呼叫中傳回這項資訊。
為了進行偵錯,從驅動程式擷取 SQLGetInfo SQL_DBMS_VER
和 SQL_DBMS_NAME。
SQLSetStmtOption SQL_QUERY_TIMEOUT
和SQL_ASYNC_ENABLE可能會在CDatabase
的HDBC上呼叫。
SQLError
可以在任何或全部參數皆為 NULL 时呼叫。
當然,SQLAllocEnv
、SQLAllocConnect
、SQLDisconnect
和SQLFreeConnect
必須支援。
ExecuteSQL
除了設定和釋放暫存 HSTMT 之外,ExecuteSQL
呼叫SQLExecDirect
、 SQLFetch
SQLNumResultCol
和 SQLMoreResults
。
SQLCancel
可以在 HSTMT 上呼叫。
獲取資料庫名稱
SQLGetInfo SQL_DATABASE_NAME
會被叫到。
BeginTrans、CommitTrans、Rollback
SQLSetConnectOption SQL_AUTOCOMMIT
和 SQLTransact SQL_COMMIT
,如果發出交易要求,則會呼叫 SQL_ROLLBACK 和 SQL_AUTOCOMMIT 。
CRecordsets
SQLAllocStmt
、SQLPrepare
、SQLExecute
(針對Open
和Requery
),SQLExecDirect
(針對更新作業),SQLFreeStmt
必須支援。
SQLNumResultCols
和 SQLDescribeCol
會在各種時間呼叫結果集。
SQLSetParam
用於係結參數數據和 DATA_AT_EXEC 功能。
SQLBindCol
會廣泛使用 來向 ODBC 註冊輸出數據行數據儲存位置。
兩 SQLGetData
個呼叫可用來擷 取SQL_LONG_VARCHAR 和 SQL_LONG_VARBINARY 數據。 第一次呼叫試圖透過以 cbMaxValue 為 0 呼叫SQLGetData
,但使用有效的 pcbValue,來找出欄位值的總長度。 如果pcbValue持有SQL_NO_TOTAL,則會擲回例外狀況。 否則,會配置 HGLOBAL ,併發出另一個 SQLGetData
呼叫來擷取整個結果。
更新
如果要求悲觀鎖定,SQLGetInfo SQL_LOCK_TYPES
將會被查詢。 如果不支援 SQL_LCK_EXCLUSIVE ,則會擲回例外狀況。
嘗試更新 CRecordset
(snapshot 或 dynaset) 會導致配置第二個 HSTMT 。 對於不支援第二個 HSTMT 的驅動程式,游標庫將模擬此功能。 不幸的是,這表示有時候可能需要在處理第二個 HSTMT 的要求之前,強制第一個 HSTMT 上的目前查詢完成。
SQLFreeStmt SQL_CLOSE
和 SQL_RESET_PARAMS 將在更新作業期間被呼叫 SQLGetCursorName
。
如果 outputColumns 中有 CLongBinarys,則必須支援 ODBC 的DATA_AT_EXEC功能。 這包括從和 SQLExecDirect
SQLParamData
傳回SQLPutData
。
SQLRowCount
在執行 之後呼叫 ,以確認 只有1筆記錄已由 SQLExecDirect
更新。
僅向前游標
僅需要 SQLFetch
來執行 Move
作業。 請注意 forwardOnly 游標不支援更新。
快照游標
快照功能需要 SQLExtendedFetch
支援。 如上所述,ODBC 遊標庫會偵測驅動程式不支援 SQLExtendedFetch
的情況,並自行提供必要的支援。
SQLGetInfo
, SQL_SCROLL_OPTIONS 必須支援 SQL_SO_STATIC。
動態集合游標
以下是開啟動態集所需的最低支援:
SQLGetInfo
, SQL_ODBC_VER 必須傳回 > “01”。
SQLGetInfo
, SQL_SCROLL_OPTIONS 必須支援 SQL_SO_KEYSET_DRIVEN。
SQLGetInfo
, SQL_ROW_UPDATES 必須傳回 「Y」。。
SQLGetInfo
、 SQL_POSITIONED_UPDATES 必須支援 SQL_PS_POSITIONED_DELETE 和 SQL_PS_POSITIONED_UPDATE。
此外,如果要求悲觀鎖定,則會進行呼叫到 SQLSetPos
,使用 irow 1、fRefresh FALSE 和 fLock SQL_LCK_EXCLUSIVE。