TN042:ODBC驱动程序开发人员建议

备注

以下技术声明,则它在联机文档,首先包括了不更新。因此,某些过程和主题可能已过时或不正确。有关最新信息,建议您搜索议题在联机文档的索引。

此说明描述了 ODBC 驱动程序编写器的准则。 概述 ODBC 函数 MFC 数据库类使和各个项目语义详细信息的一般要求和过程。 支持三个 CRecordset 打开模式所需的驱动程序功能 (forwardOnlysnapshotdynaset) 中所述。

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_CURSORSSQL_CUR_USE_ODBC

CDatabase::Open 用于SQLDriverConnectSQL_DRIVER_COMPLETE 建立到数据源的连接。

该驱动程序必须支持 SQLGetInfoSQL_ODBC_API_CONFORMANCE >= SQL_OAC_LEVEL1SQLGetInfoSQL_ODBC_SQL_CONFORMANCE >= SQL_OSC_MINIMUM

若要为 CDatabase 及其依赖记录集中支持的事务, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIORSQL_CURSOR_ROLLBACK_BEHAVIOR 必须具有 SQL_CR_PRESERVE。 否则,尝试执行事务控件将被忽略。

必须 支持SQLGetInfoSQL_DATA_SOURCE_READ_ONLY 。 如果返回 “Y”,更新操作在数据源不会执行。

如果 CDatabase 中打开只读的,尝试设置读取该数据源。 SQLSetConnectOptionSQL_ACCESS_MODESQL_MODE_READ_ONLY只做出。

如果标识符需要引用,应从与 SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR 的驱动程序返回此信息调用。

出于调试目的, SQLGetInfo SQL_DBMS_VERSQL_DBMS_NAME 从磁盘检索。

SQLSetStmtOptionSQL_QUERY_TIMEOUTSQL_ASYNC_ENABLE 可能是对 entity_CODECDatabase 的 HDBC

SQLError 可以调用与任意或所有的参数 NULL。

当然,必须支持 SQLAllocEnvSQLAllocConnectSQLDisconnectSQLFreeConnect

ExecuteSQL

除了分配和释放临时 HSTMT外, ExecuteSQL 调用 SQLExecDirectSQLFetchSQLNumResultColSQLMoreResultsSQLCancel 可以对 HSTMT

GetDatabaseName

SQLGetInfoSQL_DATABASE_NAME 将调用。

BeginTrans, CommitTrans,回滚

,如果事务请求,SQLSetConnectOptionSQL_AUTOCOMMITSQLTransactSQL_COMMITSQL_ROLLBACKSQL_AUTOCOMMIT 将调用。

CRecordsets

必须支持SQLAllocStmtSQLPrepareSQLExecute (对于 打开Requery), SQLExecDirect (对于更新操作), SQLFreeStmtSQLNumResultColsSQLDescribeCol 要对都会设置的结果。

SQLSetParam 用于固定参数数据和 DATA_AT_EXEC 功能广泛使用。

SQLBindCol 广泛用于注册输出列具有 ODBC 的数据存储位置。

SQLGetData 调用使用检索 SQL_LONG_VARCHARSQL_LONG_VARBINARY 数据。 第一次调用以尝试通过调用 SQLGetData 查找列值的总长度与 cbMaxValue 0,但是,输入一个有效的 pcbValue。 如果 pcbValue 保存 SQL_NO_TOTAL,将引发异常。 否则,分配 HGLOBAL ,并且,另一 SQLGetData 调用来检索整个结果。

Updating

如果保守式锁定请求, SQLGetInfoSQL_LOCK_TYPES 将查询。 如果 SQL_LCK_EXCLUSIVE 不支持,则将引发异常。

将导致一个 HSTMT 赋值尝试更新 CRecordset (snapshotdynaset)。 对于不支持第二 HSTMT的驱动程序,游标库是模拟此功能。 遗憾的是,这可能意味着强制在第一 HSTMT 的当前查询来完成处理第二个 HSTMT 的请求之前。

在更新操作中,SQLFreeStmtSQL_CLOSESQL_RESET_PARAMSSQLGetCursorName 将调用。

如果在 outputColumnsCLongBinarys , ODBC 的必须支持 DATA_AT_EXEC 功能。 这包括从返回 SQLExecDirectSQLParamDataSQLPutDataSQL_NEED_DATA

SQLRowCount 在执行调用验证后仅 SQLExecDirect更新 1 条记录。

ForwardOnly 光标

SQLFetch 对于 移动 操作是必需的。 请注意 forwardOnly 光标不支持更新。

光标快照

快照功能要求 SQLExtendedFetch 支持。 如上所述, ODBC 游标库将检测驱动程序时不支持 SQLExtendedFetch,并提供必要支持。

SQLGetInfoSQL_SCROLL_OPTIONS 必须支持 SQL_SO_STATIC

动态集游标

在下最小支持必需打开动态集:

SQLGetInfoSQL_ODBC_VER 必须返回 > “01 "。

SQLGetInfoSQL_SCROLL_OPTIONS 必须支持 SQL_SO_KEYSET_DRIVEN

SQLGetInfoSQL_ROW_UPDATES 必须返回 “Y”。

SQLGetInfoSQL_POSITIONED_UPDATES 必须支持 SQL_PS_POSITIONED_DELETESQL_PS_POSITIONED_UPDATE

此外,在中,如果保守式锁定请求,对 SQLSetPos 与 irow 1, fRefresh FALSE 和蜂群 SQL_LCK_EXCLUSIVE 的调用将调用。

请参见

其他资源

由Number "技术说明

技术说明按类别