ODBC 3.x 应用程序的块游标、可滚动游标和后向兼容性

SQLFetchScrollSQLExtendedFetch 的存在表示 ODBC 中应用程序编程接口 (API) 和服务提供程序接口 (SPI) 之间的第一次明确划分,前者是应用程序调用的函数集,后者是驱动程序执行的函数集。 需要此划分来平衡 ODBC 3.x 中的要求(使用 SQLFetchScroll),以便与标准保持一致,并与使用 SQLExtendedFetch 的 ODBC 2.x 兼容。

ODBC 3.x API 是应用程序调用的函数集,包括 SQLFetchScroll 和相关语句属性。 ODBC 3.x SPI 是驱动程序执行的函数集,包括 SQLFetchScrollSQLExtendedFetch 和相关语句属性。 由于 ODBC 不会在 API 和 SPI 之间正式强制实施此划分,因此 ODBC 3.x 应用程序可以调用 SQLExtendedFetch 和相关语句属性。 但是,ODBC 3.x 应用程序没有理由执行此操作。 有关 API 和 SPI 的详细信息,请参阅《ODBC 体系结构》简介。

有关 ODBC 3.x 驱动程序管理器如何映射对 ODBC 2.x 和 ODBC 3.x 驱动程序的调用,以及 ODBC 3.x 驱动程序应为块游标和可滚动游标执行哪些函数和语句属性的信息,请参阅“附录 G:驱动程序后向兼容性准则”中的“驱动程序的用途”

下表汇总了 ODBC 3.x 应用程序应该与块游标和可滚动游标一起使用的函数和语句属性。 它还列出了 ODBC 2.x 和 ODBC 3.x 在此区域中的更改,ODBC 3.x 应用程序应注意这些更改才能与 ODBC 2.x 驱动程序兼容。

函数或

语句属性
注释
SQL_ATTR_FETCH_BOOKMARK_PTR 指向要与 SQLFetchScroll 一起使用的书签。

当应用程序在 ODBC 2.x 驱动程序中设置此值时,它必须指向固定长度的书签。
SQL_ATTR_ROW_STATUS_PTR 指向由 SQLFetchSQLFetchScrollSQLBulkOperationsSQLSetPos 填充的行状态数组。

如果应用程序在 ODBC 2.x 驱动程序中设置此项,并在调用 SQLFetchScrollSQLFetchSQLExtendedFetch 之前使用 SQL_ADD 的操作调用 SQLBulkOperation,则会返回 SQLSTATE HY011(目前无法设置属性)。

当应用程序在 ODBC 2.x 驱动程序中调用 SQLFetch 时,SQLFetch 将映射到 SQLExtendedFetch,因此返回此数组中的值。
SQL_ATTR_ROWS_FETCHED_PTR 指向缓冲区,SQLFetchSQLFetchScroll 在该缓冲区中返回所提取的行数。

当应用程序在 ODBC 2.x 驱动程序中调用 SQLFetch 时,SQLFetch 将映射到 SQLExtendedFetch,因此返回此缓冲中的值。
SQL_ATTR_ROW_ARRAY_SIZE 设置行集大小。

如果应用程序使用 ODBC 2.x 驱动程序中的 SQL_ADD 操作调用 SQLBulkOperations,则 SQL_ROWSET_SIZE 将用于调用,而非 SQL_ATTR_ROW_ARRAY_SIZE,因为调用会通过 SQL_ADD 操作映射到 SQLSetPos,该操作使用 SQL_ROWSET_SIZE。

在 ODBC 2.x 驱动程序中使用 SQL_ADD 或 SQLExtendedFetch操作调用 SQLSetPos 将使用 SQL_ROWSET_SIZE。

在 ODBC 2.x 驱动程序中调用 SQLFetchSQLFetchScroll 将使用 SQL_ATTR_ROW_ARRAY_SIZE。
SQLBulkOperations 执行插入和书签操作。 在 ODBC 2.x 驱动程序中调用具有SQL_ADD操作的 SQLBulkOperations,它将映射到具有SQL_ADD操作的 SQLSetPos 以下是执行详细信息:

- 使用 ODBC 2.x 驱动程序时,应用程序必须仅使用与 StatementHandle 关联的隐式分配的 ARD;它无法分配另一个 ARD 来添加行,因为 ODBC 2.x 驱动程序不支持显式描述符操作。 应用程序必须使用 SQLBindCol 绑定到 ARD,而非 SQLSetDescFieldSQLSetDescRec
- 调用 ODBC 3.x 驱动程序时,应用程序可以在调用 SQLFetchSQLFetchScroll 之前使用 SQL_ADD 操作调用 SQLBulkOperations。 调用 ODBC 2.x 驱动程序时,应用程序在使用 SQL_ADD 操作调用 SQLBulkOperations 之前必须先调用 SQLFetchScroll
SQLFetch 返回下一个行集。 以下是执行详细信息:

- 当应用程序在 ODBC 2.x 驱动程序中调用 SQLFetch 时,它会映射到 SQLExtendedFetch
- 当应用程序在 ODBC 3.x 驱动程序中调用 SQLFetch 时,它会返回使用 SQL_ATTR_ROW_ARRAY_SIZE 语句属性指定的行数。
SQLFetchScroll 返回指定的行集。 以下是执行详细信息:

- 当应用程序在 ODBC 2.x 驱动程序中调用 SQLFetchScroll 时,它会在应用于单个行的每个错误之前返回 SQLSTATE 01S01(行中的错误)。 它这样做只是因为 ODBC 3.x 驱动程序管理器会将其映射到 SQLExtendedFetch,并且 SQLExtendedFetch 会返回此 SQLSTATE。 当应用程序在 ODBC 3.x 驱动程序中调用 SQLFetchScroll 时,它会返回 SQLSTATE 01S01(行中的错误)。
当应用程序在 ODBC 2.x 驱动程序中调用 SQLFetchScroll 并将 FetchOrientation 设置为 SQL_FETCH_BOOKMARK 时,FetchOffset 参数必须设置为 0。 如果尝试使用 ODBC 2.x 驱动程序进行基于偏移的书签提取,则会返回 SQLSTATE HYC00(未执行可选功能)。

注意

ODBC 3.x 应用程序不应使用 SQLExtendedFetch 或 SQL_ROWSET_SIZE 语句属性。 相反,它们应使用 SQLFetchScroll 和 SQL_ATTR_ROW_ARRAY_SIZE 语句属性。 ODBC 3.x 应用程序不应将 SQLSetPos 与 SQL_ADD 操作配合使用,但应将 SQLBulkOperations 与 SQL_ADD 操作配合使用。