ODBC:ODBC 游标库

本主题介绍 ODBC 游标库及其使用方法。 有关详细信息,请参阅:

ODBC 游标库是一个动态链接库 (DLL),位于 ODBC 驱动程序管理器和驱动程序之间。 在 ODBC 术语中,驱动程序保留一个游标来跟踪其在记录集中的位置。 游标标记你在记录集中滚动到的位置,即当前记录。

游标库和级别 1 ODBC 驱动程序

ODBC 游标库为级别 1 驱动程序提供以下新功能:

  • 向前和向后滚动。 级别 2 驱动程序不需要游标库,因为它们已经可以滚动。

  • 对快照的支持。 游标库管理一个包含快照的记录的缓冲区。 此缓冲区反映程序对记录的删除和编辑操作,但不反映其他用户的添加、删除或编辑操作。 因此,快照仅与游标库的缓冲区同步。 在你调用 Requery 之前,缓冲区也不会反映你自己的添加操作。 动态集不使用游标库。

游标库提供快照(静态游标),即使驱动程序通常不支持快照。 如果驱动程序已支持静态游标,则无需加载游标库即可获得快照支持。 如果使用游标库,则只能使用快照和仅限转发的记录集。 如果驱动程序支持动态集(KEYSET_DRIVEN 游标),而你想要使用它们,则不得使用游标库。 如果要同时使用快照和动态集,则必须让它们基于两个不同的 CDatabase 对象(两个不同的连接),除非驱动程序对二者都支持。

定位更新和时间戳列

注意

可以通过 MFC ODBC 类(如本主题中所述)或通过 MFC 数据访问对象 (DAO) 类访问 ODBC 数据源。

注意

如果 ODBC 驱动程序支持 SQLSetPos(MFC 在它可用时使用它),则本主题不适合你。

大多数级别 1 驱动程序不支持定位更新。 此类驱动程序依赖于游标库来模拟级别 2 驱动程序在这方面的功能。 游标库通过对未更改字段执行搜索的更新来模拟定位更新支持。

某些情况下,记录集可能包含时间戳列作为这些未更改字段之一。 将 MFC 记录集与包含时间戳列的表配合使用时,会出现两个问题。

第一个问题涉及具有时间戳列的表的可更新快照。 如果快照绑定到的表包含时间戳列,则应在调用 EditUpdate 后调用 Requery。 否则,可能无法再次编辑同一条记录。 如果在调用 Edit 后调用 Update,则会将记录写入数据源并更新时间戳列。 如果不调用 Requery,则快照中的记录的时间戳值不再与数据源上的相应时间戳匹配。 当你尝试再次更新记录时,数据源可能会因存在不匹配的情况而禁止更新。

第二个问题涉及类 CTime 的限制。与 RFX_Date 函数配合使用以将时间和日期信息传输到表或从表传输日期和时间信息时,会遇到这些限制。 在数据传输期间,处理 CTime 对象会以额外中间处理的形式增加一些开销。 CTime 对象的日期范围对某些应用程序而言也可能存在限制过多的问题。 新版 RFX_Date 函数采用 ODBC TIMESTAMP_STRUCT 参数而不采用 CTime 对象。 有关详细信息,请参阅“MFC 参考”宏和全局函数中的 RFX_Date

使用游标库

通过调用 CDatabase::OpenExCDatabase::Open 连接到数据源时,可以指定是否要对数据源使用游标库。 如果要在该数据源上创建快照,请在 OpenExdwOptions 参数中指定 CDatabase::useCursorLib 选项,或者为 Open 的 bUseCursorLib 参数指定 TRUE(默认值为 TRUE)。 如果 ODBC 驱动程序支持动态集,而你想要在数据源上打开动态集,请不要使用游标库(它掩盖了动态集所需的某些驱动程序功能)。 在这种情况下,请不要在 OpenEx 中指定 CDatabase::useCursorLib,也不要为 Open 中的 bUseCursorLib 参数指定 FALSE。

另请参阅

ODBC 基础