TN042:ODBC驱动程序开发人员建议
说明 |
---|
以下技术声明,则它在联机文档,首先包括了不更新。因此,某些过程和主题可能已过时或不正确。有关最新信息,建议您搜索议题在联机文档的索引。 |
此说明描述了 ODBC 驱动程序编写器的准则。概述 ODBC 函数 MFC 数据库类使和各个项目语义详细信息的一般要求和过程。支持三个 CRecordset 打开模式所需的驱动程序功能 (forwardOnly、 snapshot 和 dynaset) 中所述。
ODBC 的游标库
MFC 数据库类当前功能。在大多数情况下多大多数 1 级 ODBC 驱动程序提供的功能的用户。幸运的是, ODBC 的游标库将分层自己在数据库类和驱动程序和之间自动提供此附加功能。
例如,大多数 1.0 驱动程序不支持向后滚动。游标库可以检测此,并将从磁盘的缓存行和它们为请求在 FETCH_PREV 在 SQLExtendedFetch调用。
游标库依赖关系的另一个重要的示例确定的更新。大多数 1.0 驱动程序也不确定更新,但是,游标库将生成标识数据源的目标行是基于其当前缓存数据值的更新语句,否则一个缓存的时间戳值。
类库不利用多个行集合。因此,总是应用几个 SQLSetPos 语句行 1 行集合。
CDatabases
每 CDatabase 分配唯一 HDBC。(如果 entity_CODECDatabase 的使用 ExecuteSQL 功能,则暂时分配 HSTMT 。)因此,如果需要多个 entity_CODECDatabase 的,则必须支持多个 HDBC的每 HENV 。
数据库类需要游标库。这在 SQLSetConnections 反映调用 SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC。
CDatabase::Open 用于SQLDriverConnect, SQL_DRIVER_COMPLETE 建立到数据源的连接。
该驱动程序必须支持 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”,更新操作在数据源不会执行。
如果 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 可能是对 entity_CODECDatabase 的 HDBC。
SQLError 可以调用与任意或所有的参数 NULL。
当然,必须支持 SQLAllocEnv、 SQLAllocConnect、 SQLDisconnect 和 SQLFreeConnect 。
ExecuteSQL
除了分配和释放临时 HSTMT外, ExecuteSQL 调用 SQLExecDirect、 SQLFetch、 SQLNumResultCol 和 SQLMoreResults。SQLCancel 可以对 HSTMT。
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME 将调用。
BeginTrans, CommitTrans,回滚
,如果事务请求,SQLSetConnectOptionSQL_AUTOCOMMIT 和 SQLTransactSQL_COMMIT, SQL_ROLLBACK 和 SQL_AUTOCOMMIT 将调用。
CRecordsets
必须支持SQLAllocStmt, SQLPrepare, SQLExecute (对于 打开 和 Requery), 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 不支持,则将引发异常。
将导致一个 HSTMT 赋值尝试更新 CRecordset (snapshot 或 dynaset)。对于不支持第二 HSTMT的驱动程序,游标库是模拟此功能。遗憾的是,这可能意味着强制在第一 HSTMT 的当前查询来完成处理第二个 HSTMT 的请求之前。
在更新操作中,SQLFreeStmtSQL_CLOSE 和 SQL_RESET_PARAMS 和 SQLGetCursorName 将调用。
如果在 outputColumns的 CLongBinarys , ODBC 的必须支持 DATA_AT_EXEC 功能。这包括从返回 SQLExecDirect、 SQLParamData 和 SQLPutData的 SQL_NEED_DATA 。
SQLRowCount 在执行调用验证后仅 SQLExecDirect更新 1 条记录。
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 和蜂群 SQL_LCK_EXCLUSIVE 的调用将调用。