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

备注

以下技术说明在首次包括在联机文档中后未更新。因此,某些过程和主题可能已过时或不正确。要获得最新信息,建议你在联机文档索引中搜索热点话题。

此注释说明 ODBC 驱动程序编写的教程。 概述 ODBC 功能 MFC 数据库类使和各个项目通常语义详细信息的要求和过程。 支持三个必需的 CRecordset 打开模式驱动程序功能 (forwardOnly快照dynaset) 来描述。

ODBC 的游标库

MFC 数据库类当前功能。大多数情况下最多 1 级 ODBC 驱动程序提供功能的用户。 所幸,ODBC 的游标库将分层自己在数据库类和驱动程序之间并自动提供此附加功能。

例如,多数 1.0 驱动程序不支持向后滚动。 游标库在 SQLExtendedFetch的 FETCH_PREV 调用无法检测此和驱动程序从缓存的行并它们按照要求。

游标库依赖关系的另一个重要示例是定位更新。 多数 1.0 驱动程序或具有定位更新,但是,游标库将生成上标识数据源的目标行基于其当前缓存数据值的更新语句,则缓存的一个时间戳值。

类库不利用多个行集合。 因此,仍 SQLSetPos 语句始终应用 1 行的行集合。

CDatabases

每个 CDatabase 分配唯一 HDBC。(如果使用了 CDatabaseExecuteSQLHSTMT 函数暂时分配。)因此,如果需要多个 entity_CODECDatabase 的,则必须支持多个 HDBC。每个 HENV

数据库类需要游标库。 它会在 SQLSetConnections 调用 SQL_ODBC_CURSORSSQL_CUR_USE_ODBC会反映在中。

使用 CDatabase::OpenSQLDriverConnectSQL_DRIVER_COMPLETE 建立到数据源的连接。

驱动程序必须支持 SQLGetInfo SQL_ODBC_API_CONFORMANCE >SQL_OAC_LEVEL1SQLGetInfo SQL_ODBC_SQL_CONFORMANCE >SQL_OSC_MINIMUM。为 =,

为了为 CDatabase 及其相关的记录集中支持事务,SQLGetInfo 的SQL_CURSOR_COMMIT_BEHAVIORSQL_CURSOR_ROLLBACK_BEHAVIOR 必须具有 SQL_CR_PRESERVE。 否则,尝试执行事务控件将被忽略。

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

如果 CDatabase 中打开只读,尝试设置读取的数据源用 SQLSetConnectOption SQL_ACCESS_MODESQL_MODE_READ_ONLY才进行。

如果标识符的引用,应从带有 SQLGetInfo 的SQL_IDENTIFIER_QUOTE_CHAR 调用驱动程序返回此信息。

出于调试目的,SQL_DBMS_NAMESQLGetInfo SQL_DBMS_VER 和驱动程序。

SQLSetStmtOption SQL_QUERY_TIMEOUTSQL_ASYNC_ENABLE 可能在 CDatabaseHDBC

SQLError 可以调用使用的任意或所有参数为空。

当然,则必须支持、SQLAllocEnvSQLAllocConnectSQLDisconnectSQLFreeConnect

ExecuteSQL

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

GetDatabaseName

SQLGetInfo 将SQL_DATABASE_NAME 调用。

CommitTrans,回滚,BeginTrans

如果事务,请求,SQLSetConnectOption 的SQL_AUTOCOMMITSQLTransactSQL_COMMITSQL_ROLLBACKSQL_AUTOCOMMIT 调用。

CRecordsets

必须支持SQLAllocStmtSQLPrepareSQLExecute (对于 打开再次查询),SQLExecDirect (对于更新操作),SQLFreeStmtSQLNumResultColsSQLDescribeCol 在 + 不同 + 时候将设置的结果。

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 (快照dynaset) 将导致分配一个 HSTMT。 对于不支持第二 HSTMT的驱动程序,游标库是模拟此功能。 遗憾的是,这在某些情况下可能意味着强制在第一 HSTMT 的当前完成查询到在处理第二 HSTMT 请求之前。

在更新操作过程,SQLFreeStmt SQL_CLOSESQL_RESET_PARAMSSQLGetCursorName 是调用。

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

SQLRowCount 之后执行称为验证后 1 仅记录的 SQLExecDirect更新。

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 和蜂群 SQL_LCK_EXCLUSIVE 中进行。

请参见

其他资源

按编号列出的技术说明

按类别列出的技术说明