ODBC:ODBC 游标库

本主题介绍 ODBC 游标库并说明如何使用。有关更多信息,请参见:

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

  • 已定位的更新列和时间戳列

  • 使用游表库

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

游标库和 1 级 ODBC 驱动程序

ODBC 游标库赋予 1 级驱动程序下列新功能:

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

  • 支持快照。游标库管理着包含快照记录的缓冲区。此缓冲区反映程序对记录的删除和编辑,但不是其他用户的添加、删除或编辑。因此,快照只与游标库的缓冲区一样新。在您调用 Requery 之前,缓冲区也不反映您对记录所做的添加。动态集不使用游标库。

即使驱动程序通常不支持快照,游标库仍会提供快照(静态游标)。若您的驱动程序已经支持静态游标,则不再需要加载游标库来获取快照支持。如果您确实在使用游标库,则只能使用快照和仅向前记录集。如果您的驱动程序支持动态集(KEYSET_DRIVEN 游标),而且您要使用它们,则一定不要使用游标库。如果要同时使用快照和动态集,则必须将它们基于两个不同的 CDatabase 对象上(两条不同的连接)上,除非您的驱动程序同时支持快照和动态集。

已定位的更新列和时间戳列

说明说明

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

说明说明

如果您的 ODBC 驱动程序支持 SQLSetPos(只要有,MFC 就使用它),则本主题不适用于您。

多数 1 级驱动程序都不支持定位更新。这些驱动程序依靠游标库来模拟 2 级驱动程序在这方面的功能。游标库通过对不变的字段执行搜索更新来模拟定位更新支持。

在某些情况下,记录集可能包含一个时间戳列作为其中一个不变字段。如果 MFC 记录集中的表含有时间戳列,使用这样的 MFC 记录集时,则会出现两个问题。

第一个问题关系到具有时间戳列的表上的可更新快照。如果快照所绑定的表含有时间戳列,则应该在调用了 EditUpdate 之后调用 Requery。否则,可能不能再次编辑同一记录。调用 Edit 之后再调用 Update 时,将记录写入数据源,并更新时间戳列。如果不调用 Requery,则快照中该记录的时间戳值不再与数据源上对应的时间戳值相符。尝试再次更新该记录时,数据源可能因为值不相符而不允许更新。

第二个问题涉及在 CTimeRFX_Date 函数一起使用,以向表中或从表中传输时间和日期信息时,对该类的限制。由于数据传输过程中一些额外的中间处理,处理 CTime 对象要增加一些系统开销。CTime 对象的日期范围也可能极大地限制某些应用程序。RFX_Date 函数的新版本使用 ODBC TIMESTAMP_STRUCT 参数,而不再使用 CTime 对象。有关更多信息,请参见“MFC 参考”中的宏和全局中的 RFX_Date

使用游表库

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

请参见

概念

ODBC 基础