TN042: ODBC 驅動程式開發人員的建議事項
![]() |
---|
由於它第一次線上文件中包含尚未更新下列技術提示。如此一來,某些程序和主題可能已經過期或不正確。如需最新資訊,建議您先搜尋線上文件索引中有興趣的主題。 |
這個註解會描述供 ODBC 驅動程式撰寫方針。 它簡述一般的需求和假設 ODBC 功能使 MFC 資料庫類別,以及各種預期的語意詳細資料。 所需的驅動程式的功能,以支援三種CRecordset開啟模式 (forwardOnly, 快照集和的動態集中) 所述。
ODBC 的資料指標程式庫
MFC 資料庫類別會提供功能給使用者超過大多數的層級 1 ODBC 驅動程式所提供的功能,在許多情況下。 所幸,ODBC 的資料指標程式庫層本身之間的資料庫類別和驅動程式,而且會自動提供了豐富的這項額外的功能。
舉個例說,大多數 1.0 的驅動程式不支援向後捲動。 資料指標程式庫可以偵測這點,並將快取中的驅動程式的資料列和簡報的方式依要求在 FETCH_PREV 中的呼叫 SQLExtendedFetch。
另一個重要的例子,資料指標程式庫相依性是定位的更新。 大多數的 1.0 驅動程式也沒有定位的更新,但資料指標程式庫就會產生 update 陳述式用來識別目標資料列根據其目前的快取的資料值或快取的時間戳記值的資料來源上。
類別庫會永遠不會利用多個資料列集。 因此,那幾個 SQLSetPos 陳述式會自動套用到列 1 的資料列集。
CDatabases
每個CDatabase配置會有一個 HDBC。 (如果CDatabase的ExecuteSQL使用函式時, 的 HSTMT 會暫時配置。)因此,如果有多個CDatabase的需要,多個 HDBCs 每個 HENV 必須支援此模式。
資料庫類別會要求資料指標程式庫。 這會反映在 SQLSetConnections 呼叫 SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC。
SQLDriverConnect, SQL_DRIVER_COMPLETE 由CDatabase::Open來建立資料來源的連接。
驅動程式必須支援 SQLGetInfoSQL_ODBC_API_CONFORMANCE > = SQL_OAC_LEVEL1, SQLGetInfoSQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM。
為了讓交易可支援CDatabase和其相依資料錄集, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR 和 SQL_CURSOR_ROLLBACK_BEHAVIOR 必須要有 SQL_CR_PRESERVE。 否則,嘗試執行交易控制將被忽略。
SQLGetInfoSQL_DATA_SOURCE_READ_ONLY 必須支援此模式。 如果它傳回"Y",將資料來源上不執行任何 update 作業。
如果CDatabase開啟成唯讀,就嘗試設定資料來源讀取只會與進行 SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY。
如果識別項需要加註引號於,這項資訊應該會傳回從驅動程式和 SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR 呼叫。
進行偵錯, SQLGetInfo SQL_DBMS_VER 和 SQL_DBMS_NAME 擷取驅動程式。
SQLSetStmtOptionSQL_QUERY_TIMEOUT 和 SQL_ASYNC_ENABLE 可能會在呼叫CDatabase的 HDBC。
SQLError 可能會呼叫任何或所有的引數 NULL。
不用說, SQLAllocEnv, SQLAllocConnect, SQLDisconnect 和 SQLFreeConnect 必須支援此模式。
ExecuteSQL
除了配置和清出暫存的 HSTMT, ExecuteSQL呼叫 SQLExecDirect, SQLFetch, SQLNumResultCol 和SQLMoreResults。 SQLCancel 可能會在呼叫的 HSTMT。
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME 就會呼叫。
集指令,版本,復原
SQLSetConnectOptionSQL_AUTOCOMMIT 和 SQLTransactSQL_COMMIT, SQL_ROLLBACK 和 SQL_AUTOCOMMIT 交易要求時,是否呼叫常式。
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (如開啟 和 重新查詢), SQLExecDirect (適用於更新作業), SQLFreeStmt 必須支援此模式。 SQLNumResultCols 和 SQLDescribeCol 時呼叫的結果集在不同的時候。
SQLSetParam 可廣泛地用參數的資料繫結和 DATA_AT_EXEC 功能。
SQLBindCol 可廣泛地用來註冊輸出使用 ODBC 的資料行資料儲存位置。
兩個 SQLGetData 呼叫用來擷取 SQL_LONG_VARCHAR 和 SQL_LONG_VARBINARY 的資料。 第一次呼叫會嘗試尋找的總長度資料行的值,藉由呼叫 SQLGetData cbMaxValue 為 0,而有效的 pcbValue。 如果保留 pcbValue SQL_NO_TOTAL,會擲回例外狀況。 否則, HGLOBAL配置時,和另一個 SQLGetData 就呼叫擷取整個結果。
Updating
如果要求封閉式鎖定時, SQLGetInfoSQL_LOCK_TYPES 需要查詢。 如果 SQL_LCK_EXCLUSIVE 是不受支援,例外狀況會擲回。
嘗試更新CRecordset (快照集或的動態集中) 將會造成第二個 hstmt 存入配置。 不支援的驅動程式的第二個的 HSTMT,資料指標程式庫,以模擬這項功能。 不幸的是,這可能有時表示強制目前的查詢,第一天 hstmt 存入 完成之前先處理第二個 的 HSTMT要求時。
SQLFreeStmtSQL_CLOSE 和 SQL_RESET_PARAMS 和 SQLGetCursorName 就會在更新作業期間呼叫。
如果有 CLongBinarys 在 outputColumns,ODBC 的 DATA_AT_EXEC 必須支援的功能。 這包括傳回 SQL_NEED_DATA 的 SQLExecDirect, SQLParamData 和 SQLPutData。
SQLRowCount 之後若要確認只有 1 的資料錄已更新的執行會呼叫 SQLExecDirect。
ForwardOnly 資料指標
只有 SQLFetch 才移動作業。 請注意, 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 將會進行。