共用方式為


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 SQLAllocConnectSQLFreeConnect

ExecuteSQL

除了配置和釋放暫存 HSTMT 之外, ExecuteSQL 呼叫 SQLExecDirectSQLFetch SQLNumResultColSQLMoreResultsSQLCancel可能會在 HSTMT 呼叫。

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME 將會呼叫 。

BeginTrans、CommitTrans、Rollback

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

CRecordsets

SQLAllocStmt必須支援 、 SQLPrepareSQLExecute [For OpenRequery ] SQLExecDirect SQLFreeStmt (針對更新作業)。 SQLNumResultColsSQLDescribeCol 會在各種時間呼叫結果集。

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 功能。 這包括從 SQLExecDirectSQLParamData 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

另請參閱

依編號顯示的技術提示
依分類區分的技術提示