动态集

本主题介绍动态集并讨论其可用性

注意

本主题适用于 MFC ODBC 类,包括 CRecordset。 有关 DAO 类中的动态集的信息,请参阅 CDaoRecordset。 使用 DAO 可以打开动态集类型记录集。

动态集是具有动态属性的记录集。 在其生存期中,处于动态集模式的记录集对象(通常称为动态集)通过以下方式与数据源保持同步。 在多用户环境中,其他用户可能会编辑或删除动态集中的记录,或者将记录添加到动态集所代表的表中。 由应用程序在记录集中添加或删除的记录将反映在动态集中。 在通过调用动态集的 Requery 成员函数重新生成动态集之前,由其他用户添加到表中的记录不会反映在动态集中。 当其他用户删除记录时,MFC 代码会跳过记录集中删除的内容。 在你滚动到受影响的记录后,其他用户对现有记录的编辑更改会立即反映在动态集中。

同样,你对动态集中的记录所做的编辑会反映在其他用户使用的动态集中。 你添加的记录在其他用户重新查询其动态集之前不会反映在他们的动态集中。 删除的记录在其他用户的记录集中标记为“已删除”。 如果你与同一数据库建立了多个连接(多个 CDatabase 对象),则与这些连接关联的记录集的状态与其他用户的记录集状态相同。

如果数据必须是动态的(例如,在航班预订系统中),则动态集最有价值。

注意

若要使用动态集,支持动态集的数据源必须具有 ODBC 驱动程序,并且不得加载 ODBC 游标库。 有关详细信息,请参阅动态集的可用性

若要指定记录集是动态集,请将 CRecordset::dynaset 作为第一个参数传递给记录集对象的 Open 成员函数。

注意

对于可更新的动态集,ODBC 驱动程序必须支持定位更新语句或 ::SQLSetPos ODBC API 函数。 如果两者都受支持,MFC 使用 ::SQLSetPos 以提高效率。

动态集的可用性

如果满足以下要求,则 MFC 数据库类支持动态集:

  • ODBC 游标库 DLL 必须未用于此数据源。

    如果使用了该游标库,则会屏蔽基础 ODBC 驱动程序的某些功能,而必须具备这些功能才能支持动态集。 如果你想要使用动态集(并且 ODBC 驱动程序具有动态集所需的功能,如本部分的余下内容所述),可以在创建 CDatabase 对象时使 MFC 不加载游标库。 有关详细信息,请参阅 ODBC,以及 CDatabase 类的 OpenExOpen 成员函数。

    在 ODBC 术语中,动态集和快照称为游标。 游标是一种用于跟踪其在记录集中的位置的机制。

  • 数据源的 ODBC 驱动程序必须支持键集驱动的游标。

    键集驱动的游标通过获取和存储一组键来管理表中的数据。 当用户滚动到特定的记录时,将使用这些键从表中获取当前数据。 若要确定驱动程序是否提供此支持,请结合 SQL_SCROLL_OPTIONS 参数调用 ::SQLGetInfo ODBC API 函数

    如果你尝试在不支持键集的情况下打开动态集,则会收到 CDBException,其中包含返回代码值 AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED。

  • 数据源的 ODBC 驱动程序必须支持扩展的提取。

    扩展的获取是向后和向前滚动 SQL 查询结果记录的功能。 若要确定驱动程序是否支持此功能,请结合 SQL_API_SQLEXTENDEDFETCH 参数调用 ::SQLGetFunctions ODBC API 函数

如果你想要可更新的动态集(或者这方面的快照),ODBC 驱动程序还必须支持 ::SQLSetPos ODBC API 函数或定位更新。 ::SQLSetPos 函数允许 MFC 在不发送 SQL 语句的情况下更新数据源。 如果此支持可用,MFC 会优先使用它,而不是使用 SQL 进行更新。 若要确定驱动程序是否支持 ::SQLSetPos,请结合 SQL_POS_OPERATIONS 参数调用 ::SQLGetInfo

定位更新使用 SQL 语法(格式为 WHERE CURRENT OF <cursorname>)来标识数据源上的表中的特定行。 若要确定驱动程序是否支持定位更新,请结合 SQL_POSITIONED_STATEMENTS 参数调用 ::SQLGetInfo

一般情况下,MFC 动态集(但不是只进记录集)需要具有 2 级 API 一致性的 ODBC 驱动程序。 如果数据源的驱动程序符合 1 级 API 集,则仍然可以使用可更新快照、只读快照和只进记录集,但不能使用动态集。 但是,如果 1 级驱动程序支持扩展提取和由键集驱动的游标,则它可以支持动态集。 有关 ODBC 一致性级别的详细信息,请参阅 ODBC

注意

如果要同时使用快照和动态集,则必须将它们基于两个不同的 CDatabase 对象(两个不同的连接)。

与使用 ODBC 游标库维护的中间存储的快照不同,在你滚动到某条记录后,动态集立即就会直接从数据源中提取该记录。 这样,动态集最初选择的记录将与数据源保持同步。

有关此版本的 Visual C++ 中包含的 ODBC 驱动程序列表以及有关获取其他驱动程序的信息,请参阅 ODBC 驱动程序列表

另请参阅

开放式数据库连接 (ODBC)