SQLFetchScroll(游标库)

重要

Windows 的未来版本中将移除此功能。 避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。 Microsoft 建议使用驱动程序的游标功能。

本主题讨论在游标库中使用 SQLFetchScroll 函数。 有关 SQLFetchScroll 的一般信息,请参阅 SQLFetchScroll 函数

游标库通过在驱动程序中重复调用 SQLFetch 来实现 SQLFetchScroll 它将从驱动程序检索的数据传输到应用程序提供的行集缓冲区。 它还将数据缓存在内存和磁盘文件中。 当应用程序请求新行集时,游标库会根据需要从驱动程序 (检索它(如果以前未) 提取)或缓存 ((如果以前已) 提取)。 最后,游标库维护缓存数据的状态,并将此信息返回到行状态数组中的应用程序。

使用游标库时,对 SQLFetchScroll 的调用不能与对 SQLFetchSQLExtendedFetch 的调用混合。

使用游标库时,ODBC 2 支持调用 SQLFetchScrollx 和 对于 ODBC 3。x 驱动程序。

行集缓冲区

在以下情况下,游标库优化从驱动程序到应用程序提供的行集缓冲区的数据传输:

  • 应用程序使用行绑定。

  • 应用程序声明用于保存数据行的结构中的字段之间没有未使用的字节。

  • SQLFetchSQLFetchScroll 返回列的长度/指示器的字段位于该列的缓冲区之后,并位于下一列的缓冲区之前。 这些字段是可选的。

当应用程序请求新的行集时,游标库会根据需要从其缓存和驱动程序检索数据。 如果新行集和旧行集重叠,游标库可以通过重用行集缓冲区的重叠部分中的数据来优化其性能。 因此,对行集缓冲区的未保存更改将丢失,除非新行集和旧行集重叠且更改位于行集缓冲区的重叠部分。 为了保存更改,应用程序会提交定位的更新语句。

请注意,当应用程序调用将 FetchOrientation 参数设置为 SQL_FETCH_RELATIVE 且 FetchOffset 参数设置为 0 的 SQLFetchScroll 时,游标库始终使用缓存中的数据刷新行集缓冲区。

游标库支持调用属性为 SQL_ATTR_ROW_ARRAY_SIZE 的 SQLSetStmtAttr,以在游标打开时更改行集大小。 新的行集大小将在下次调用 SQLFetchScroll 时生效。

结果集成员身份

游标库仅在应用程序请求时从驱动程序中检索数据。 根据数据源和 SQL_CONCURRENCY 语句属性的设置,这会产生以下后果:

  • 游标库检索的数据可能与执行语句时可用的数据不同。 例如,在打开游标后,某些驱动程序可以检索在当前游标位置以外的点插入的行。

  • 结果集中的数据可能被游标库的数据源锁定,因此其他用户不可用。

游标库缓存了一行数据后,它无法检测对基础数据源 (中该行的更改,但定位更新和删除操作在同一游标的缓存) 除外。 出现这种情况的原因是,对于对 SQLFetchScroll 的调用,游标库从不从数据源重新提取数据。 相反,它会从缓存中重新提取数据。

滚动

游标库支持 SQLFetchScroll 中的以下提取类型。

游标类型 提取类型
只进 SQL_FETCH_NEXT
静态 SQL_FETCH_NEXT

SQL_FETCH_PRIOR

SQL_FETCH_FIRST

SQL_FETCH_LAST

SQL_FETCH_RELATIVE

SQL_FETCH_ABSOLUTE

SQL_FETCH_BOOKMARK

错误

当调用 SQLFetchScroll 并且对 SQLFetch 的一个调用返回SQL_ERROR时,游标库将按如下所示进行。 完成这些步骤后,游标库将继续处理。

  1. 调用 SQLGetDiagRec 从驱动程序获取错误信息,并将其作为诊断记录发布到驱动程序管理器中。

  2. 将诊断记录中的SQL_DIAG_ROW_NUMBER字段设置为适当的值。

  3. 将诊断记录中的SQL_DIAG_COLUMN_NUMBER字段设置为适当的值(如果适用);否则,它会将其设置为 0。

  4. 将行状态数组中错误行的值设置为SQL_ROW_ERROR。

游标库在 SQLFetchScroll 实现中多次调用 SQLFetch 后,对 SQLFetch 的某个调用返回的任何错误或警告都将位于诊断记录中,并且可以通过调用 SQLGetDiagRec 进行检索。 如果在提取数据时被截断,截断的数据现在将驻留在游标库的缓存中。 后续调用 SQLFetchScroll 以滚动到包含截断数据的行将返回截断的数据,并且不会引发任何警告,因为数据是从游标库的缓存中提取的。 若要跟踪返回的数据长度,以便可以确定是否截断了缓冲区中返回的数据,应用程序应绑定长度/指示器缓冲区。

书签操作

游标库支持使用 fetchOrientation SQL_FETCH_BOOKMARK 调用 SQLFetchScroll。 它还支持在 FetchOffset 参数中指定可在书签操作中使用的偏移量。 这是游标库支持的唯一书签操作。 游标库不支持调用 SQLBulkOperations

如果应用程序已设置 SQL_ATTR_USE_BOOKMARKS 语句属性并绑定到书签列,则游标库将生成固定长度的书签并将其返回到应用程序。 游标库创建和维护它使用的书签;它不使用在数据源中维护的书签。 调用 SQLFetchScroll 以检索已从数据源提取的数据块时,它会从游标库缓存中检索数据。 因此,游标库必须创建和维护对 SQLFetchScrollFetchOrientation(具有 SQL_FETCH_BOOKMARK fetchOrientation )的 SQLFetchScroll 中使用的书签。

与其他函数交互

应用程序必须先调用 SQLFetchSQLFetchScroll ,然后才能准备或执行任何定位的更新或删除语句。