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。(如果使用了 CDatabaseExecuteSQL,HSTMT 函数暂时分配。)因此,如果需要多个 entity_CODECDatabase 的,则必须支持多个 HDBC。每个 HENV。
数据库类需要游标库。 它会在 SQLSetConnections 调用 SQL_ODBC_CURSORS,SQL_CUR_USE_ODBC会反映在中。
使用 CDatabase::OpenSQLDriverConnect,SQL_DRIVER_COMPLETE 建立到数据源的连接。
驱动程序必须支持 SQLGetInfo SQL_ODBC_API_CONFORMANCE >SQL_OAC_LEVEL1SQLGetInfo SQL_ODBC_SQL_CONFORMANCE >SQL_OSC_MINIMUM。为 =,
为了为 CDatabase 及其相关的记录集中支持事务,SQLGetInfo 的SQL_CURSOR_COMMIT_BEHAVIOR 和 SQL_CURSOR_ROLLBACK_BEHAVIOR 必须具有 SQL_CR_PRESERVE。 否则,尝试执行事务控件将被忽略。
必须支持SQLGetInfoSQL_DATA_SOURCE_READ_ONLY。 如果返回“Y”,更新操作在数据源不会运行。
如果 CDatabase 中打开只读,尝试设置读取的数据源用 SQLSetConnectOption SQL_ACCESS_MODE,SQL_MODE_READ_ONLY才进行。
如果标识符的引用,应从带有 SQLGetInfo 的SQL_IDENTIFIER_QUOTE_CHAR 调用驱动程序返回此信息。
出于调试目的,SQL_DBMS_NAME 从 SQLGetInfo SQL_DBMS_VER 和驱动程序。
SQLSetStmtOption SQL_QUERY_TIMEOUT 和 SQL_ASYNC_ENABLE 可能在 CDatabaseHDBC。
SQLError 可以调用使用的任意或所有参数为空。
当然,则必须支持、SQLAllocEnv、SQLAllocConnect、SQLDisconnect 和 SQLFreeConnect。
ExecuteSQL
除了分配和释放临时 HSTMT之外,ExecuteSQL 调用 SQLExecDirect、SQLFetch、SQLNumResultCol 和 SQLMoreResults。 SQLCancel 可以调用 HSTMT。
GetDatabaseName
SQLGetInfo 将SQL_DATABASE_NAME 调用。
CommitTrans,回滚,BeginTrans
如果事务,请求,SQLSetConnectOption 的SQL_AUTOCOMMIT 和 SQLTransact,SQL_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
如果保守式锁定请求 SQLGetInfo,SQL_LOCK_TYPES 将查询。 如果 SQL_LCK_EXCLUSIVE 不支持,将引发异常。
尝试更新 CRecordset (快照 或 dynaset) 将导致分配一个 HSTMT。 对于不支持第二 HSTMT的驱动程序,游标库是模拟此功能。 遗憾的是,这在某些情况下可能意味着强制在第一 HSTMT 的当前完成查询到在处理第二 HSTMT 请求之前。
在更新操作过程,SQLFreeStmt SQL_CLOSE、SQL_RESET_PARAMS 和 SQLGetCursorName 是调用。
如果在 outputColumns的 CLongBinarys,则必须支持 DATA_AT_EXEC ODBC 的功能。 这包括从 SQLExecDirect返回的 SQL_NEED_DATA、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 和蜂群 SQL_LCK_EXCLUSIVE 中进行。