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 。 (如果使用 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 可能會在 的 HDBC 上 CDatabase
呼叫。
SQLError
可以使用任何或所有引數 Null 呼叫。
當然, SQLAllocEnv
必須支援 、 SQLDisconnect
SQLAllocConnect
和 SQLFreeConnect
。
ExecuteSQL
除了配置和釋放暫存 HSTMT 之外, ExecuteSQL
呼叫 SQLExecDirect
、 SQLFetch
SQLNumResultCol
和 SQLMoreResults
。 SQLCancel
可能會在 HSTMT 上 呼叫。
GetDatabaseName
SQLGetInfo SQL_DATABASE_NAME
將會呼叫 。
BeginTrans、CommitTrans、Rollback
SQLSetConnectOption SQL_AUTOCOMMIT
和 SQLTransact SQL_COMMIT
, 如果發出交易要求,則會呼叫 SQL_ROLLBACK 和 SQL_AUTOCOMMIT 。
CRecordsets
SQLAllocStmt
必須支援 、 SQLPrepare
、 SQLExecute
[For Open
和 Requery
] SQLExecDirect
SQLFreeStmt
(針對更新作業)。 SQLNumResultCols
和 SQLDescribeCol
會在各種時間呼叫結果集。
SQLSetParam
會廣泛用於系結參數資料和 DATA_AT_EXEC 功能。
SQLBindCol
會廣泛使用 來向 ODBC 註冊輸出資料行資料儲存位置。
兩 SQLGetData
個呼叫可用來擷取 SQL_LONG_VARCHAR 和 SQL_LONG_VARBINARY 資料。 第一次呼叫會嘗試使用 cbMaxValue 0 呼叫 SQLGetData
,但具有有效的cbMaxValue,以尋找資料行值的總長度。 如果SQL_NO_TOTAL,就會 擲回例外狀況。 否則, 會配置 HGLOBAL ,併發出另一個 SQLGetData
呼叫來擷取整個結果。
更新
如果要求悲觀鎖定, SQLGetInfo SQL_LOCK_TYPES
將會查詢。 如果 不支援SQL_LCK_EXCLUSIVE ,則會擲回例外狀況。
嘗試更新 (snapshot 或 dynaset ) 會導致配置第二 個 HSTMT 。 CRecordset
對於不支援第二個 HSTMT 的驅動程式,資料指標程式庫會模擬這項功能。 不幸的是,這有時可能表示在處理第二個 HSTMT 的要求之前,強制第一個 HSTMT 上的目前查詢完成。
SQLFreeStmt SQL_CLOSE
和 SQL_RESET_PARAMS ,將在 SQLGetCursorName
更新作業期間呼叫。
如果 outputColumns 中有 CLongBinarys ,則必須支援 ODBC 的 DATA_AT_EXEC 功能。 這包括從 SQLExecDirect
和 SQLParamData
SQLPutData
傳 回SQL_NEED_DATA 。
SQLRowCount
在執行 之後呼叫 ,以確認 只有 1 筆記錄已由 SQLExecDirect
更新。
ForwardOnly 資料指標
只有 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 。