引入的版本:ODBC 3.0 标准符合性:ISO 92
SQLFetchScroll
从结果集中提取指定的数据行集,并返回所有绑定列的数据。 行集可以在绝对位置或相对位置或通过书签指定。
使用 ODBC 2.x 驱动程序时,驱动程序管理器将此函数映射到
SQLExtendedFetch
。 有关详细信息,请参阅
映射替换函数以实现应用程序的
向后兼容性。
SQLRETURN SQLFetchScroll(
SQLHSTMT StatementHandle,
SQLSMALLINT FetchOrientation,
SQLLEN FetchOffset);
StatementHandle
[输入]语句句柄。
FetchOrientation
提取类型:
SQL_FETCH_NEXT
SQL_FETCH_PRIOR
SQL_FETCH_FIRST
SQL_FETCH_LAST
SQL_FETCH_ABSOLUTE
SQL_FETCH_RELATIVE
SQL_FETCH_BOOKMARK
有关详细信息,请参阅“注释”部分中的“定位光标”。
FetchOffset
要提取的行数。 此参数的解释取决于 FetchOrientation
参数的值
。 有关详细信息,请参阅“注释”部分中的“定位光标”。
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。
当 SQLFetchScroll
返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时
,可以通过使用 handleType of SQL_HANDLE_STMT 和 StatementHandle 句柄调用
SQLGetDiagRec
来获取关联的 SQLSTATE 值。 下表列出了 SQLFetchScroll
通常返回
的 SQLSTATE 值,并解释此函数上下文中的每个值;表示法“(DM)”位于驱动程序管理器返回的 SQLSTATE 的说明之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。 如果在单个列中发生错误,
则可以使用SQL_DIAG_COLUMN_NUMBER的 DiagIdentifier 调用 SQLGetDiagField
以确定发生错误的列;
可以使用SQL_DIAG_ROW_NUMBER的 DiagIdentifier 调用 SQLGetDiagField
以确定包含该列的行。
对于可以返回SQL_SUCCESS_WITH_INFO或SQL_ERROR(01xxx SQLSTATEs 除外)的所有 SQLSTATE,如果一个或多个操作(但不是全部)发生错误,则返回SQL_SUCCESS_WITH_INFO;如果单行操作发生错误,则返回SQL_ERROR。
SQLSTATE
01S06
在结果集返回第一个行集之前尝试提取
当 FetchOrientation SQL_FETCH_PRIOR时,请求的行集与结果集的开始重叠,当前位置超出第一行,当前行的数目小于或等于行集大小。
当 FetchOrientation SQL_FETCH_PRIOR时,请求的行集与结果集的开始重叠,当前位置超出结果集的末尾,行集大小大于结果集大小。
当 FetchOrientation SQL_FETCH_RELATIVE,FetchOffset 为负时,请求的行集与结果集的开始重叠,FetchOffset 的绝对值小于或等于行集大小。
当 FetchOrientation SQL_FETCH_ABSOLUTE、FetchOffset 为负时,请求的行集与结果集的开始重叠,FetchOffset 的绝对值大于结果集大小,但小于或等于行集大小。
(函数返回SQL_SUCCESS_WITH_INFO。)
01S07
为列返回的数据被截断。 对于数值数据类型,数字的小数部分被截断。 对于包含时间分量的时间、时间戳和间隔数据类型,时间的小数部分被截断。
(函数返回SQL_SUCCESS_WITH_INFO。)
07006
受限数据类型属性冲突
结果集中列的数据值无法转换为 SQLBindCol
中
TargetType
指定的
数据类型。
列 0 与数据类型SQL_C_BOOKMARK绑定,SQL_ATTR_USE_BOOKMARKS语句属性设置为SQL_UB_VARIABLE。
列 0 与数据类型SQL_C_VARBOOKMARK绑定,并且SQL_ATTR_USE_BOOKMARKS语句属性未设置为SQL_UB_VARIABLE。
07009
描述符索引无效
驱动程序是不支持 SQLExtendedFetch
的 ODBC 2*.x* 驱动程序
,在绑定中指定的列号为 0。
列 0 已绑定,SQL_ATTR_USE_BOOKMARKS语句属性设置为SQL_UB_OFF。
08S01
通信链接失败
驱动程序与驱动程序连接到的数据源之间的通信链接在函数完成处理之前失败。
22001
字符串数据,右截断
已截断为列返回的可变长度书签。
22002
指示符变量是必需的,但未提供
NULL 数据被提取到
SQLBindCol
设置StrLen_or_IndPtr
列(或 SQLSetDescField
或
SQLSetDescRec
设置
的SQL_DESC_INDICATOR_PTR)是空指针。
22003
数值范围之外
返回一个或多个绑定列的数值(作为数字或字符串),会导致截断数字的整个(而不是小数部分)。
有关详细信息,请参阅
附录 D:数据类型中的
将数据从 SQL 转换为 C 数据类型
。
22007
日期/时间格式无效
结果集中的字符列绑定到日期、时间或时间戳 C 结构,并且列中的值分别是无效的日期、时间或时间戳。
22012
返回算术表达式中的值,这导致除以零。
22015
间隔字段溢出
从确切的数字或间隔 SQL 类型分配给间隔 C 类型会导致前导字段中的有效数字丢失。
将数据提取到间隔 C 类型时,间隔 C 类型中没有 SQL 类型的值表示形式。
22018
强制转换规范的字符值无效
结果集中的字符列绑定到字符 C 缓冲区,并且该列包含一个字符,该字符集在缓冲区的字符集中没有表示形式。
C 类型是精确或近似数字、日期/时间或间隔数据类型;列的 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。
24000
游标状态无效
StatementHandle
处于执行状态,但没有结果集与
StatementHandle
相关联。
40001
序列化失败
执行提取的事务已终止,以防止死锁。
40003
语句完成未知
执行此函数期间关联的连接失败,无法确定事务的状态。
HY000
发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText
缓冲区中
SQLGetDiagRec
返回
的错误消息描述错误及其原因。
HY001
内存分配错误
驱动程序无法分配支持执行或完成函数所需的内存。
HY008
操作已取消
为
StatementHandle
启用了异步处理。 调用了该函数,在完成执行之前,
对 StatementHandle 调用
了 SQLCancel 或
SQLCancelHandle
。 然后,在 StatementHandle
上
再次调用该函数。
调用了函数,在完成执行之前,SQLCancel 或
SQLCancelHandle
从多线程应用程序中的不同线程调用
StatementHandle
。
HY010
函数序列错误
(DM) 为与
StatementHandle
关联的连接句柄调用异步执行函数。 调用 SQLFetchScroll
函数时,
此异步函数仍在执行。
(DM)
为 StatementHandle
调用
了 SQLExecute
、
SQLExecDirect
或
SQLMoreResults
,并返回了SQL_PARAM_DATA_AVAILABLE。 在检索所有流式处理参数的数据之前调用此函数。
(DM) 指定的
StatementHandle
未处于执行状态。 在未首先调用 SQLExecDirect
、
SQLExecute
或目录函数的情况下调用
该函数。
(DM) 为
StatementHandle
调用异步执行函数(而不是此函数),并在调用此函数时仍在执行。
(DM)
为 StatementHandle
调用
了 SQLExecute
、
SQLExecDirect
、
SQLBulkOperations
或
SQLSetPos
,并返回了SQL_NEED_DATA。 在为所有数据执行参数或列发送数据之前调用此函数。
(DM)
在调用 SQLExtendedFetch 并
调用 sqlFreeStmt
和调用 SQL_CLOSE 选项之前
,为 StatementHandle
调用
SQLFetch
。
HY013
内存管理错误
无法处理函数调用,因为基础内存对象无法访问,可能是因为内存条件低。
HY090
字符串或缓冲区长度无效
SQL_ATTR_USE_BOOKMARK语句属性设置为SQL_UB_VARIABLE,列 0 绑定到长度不等于此结果集书签的最大长度的缓冲区。 (此长度在 IRD 的SQL_DESC_OCTET_LENGTH字段中可用,可通过调用
获取SQLDescribeCol
、
SQLColAttribute
或
SQLGetDescField
。)
HY106
从范围中提取类型
DM) 为参数 FetchOrientation 指定的值无效。
(DM) 参数 FetchOrientation 已SQL_FETCH_BOOKMARK,SQL_ATTR_USE_BOOKMARKS语句属性设置为SQL_UB_OFF。
SQL_ATTR_CURSOR_TYPE语句属性的值SQL_CURSOR_FORWARD_ONLY,参数 FetchOrientation 的值未SQL_FETCH_NEXT。
SQL_ATTR_CURSOR_SCROLLABLE语句属性的值SQL_NONSCROLLABLE,参数 FetchOrientation 的值未SQL_FETCH_NEXT。
HY107
行值范围外
使用 SQL_ATTR_CURSOR_TYPE 语句属性指定的值SQL_CURSOR_KEYSET_DRIVEN,但使用 SQL_ATTR_KEYSET_SIZE 语句属性指定的值大于 0,小于使用 SQL_ATTR_ROW_ARRAY_SIZE 语句属性指定的值。
HY111
书签值无效
参数 FetchOrientation SQL_FETCH_BOOKMARK,SQL_ATTR_FETCH_BOOKMARK_PTR 语句属性中的值指向的书签无效或为 null 指针。
HY117
连接因未知事务状态而挂起。 仅允许断开连接和只读函数。
(DM) 有关挂起状态的详细信息,请参阅
SQLEndTran 函数
。
HYC00
未实现可选功能
驱动程序或数据源不支持由 SQLBindCol
中
TargetType
和相应列的 SQL 数据类型组合
指定的转换。
HYT00
在数据源返回请求的结果集之前,查询超时期限已过期。 超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01
超过连接超时时间
在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过
SQLSetConnectAttr
设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001
驱动程序不支持此函数
(DM) 与
StatementHandle
关联的驱动程序不支持该函数。
IM017
在异步通知模式下禁用轮询
每当使用通知模型时,轮询将被禁用。
IM018
尚未调用 SQLCompleteAsync
来完成此句柄上的上一个异步操作。
如果句柄上的上一个函数调用返回SQL_STILL_EXECUTING并且启用通知模式,
则必须在句柄上调用 SQLCompleteAsync
才能执行后期处理并完成操作。
SQLFetchScroll
从结果集中返回指定的行集。 行集可以按绝对位置或相对位置或书签指定。
只有在结果集存在时才能调用 SQLFetchScroll
,即在创建结果集的调用之后,以及关闭该结果集上的游标之前。 如果绑定了任何列,它将返回这些列中的数据。 如果应用程序已指定指向行状态数组的指针或要在其中返回提取的行数的缓冲区,
SQLFetchScroll
也会返回此信息。
对 SQLFetchScroll
的调用可与对 SQLFetch
的调用
混合,但不能与对 SQLExtendedFetch
的
调用混合。
有关详细信息,请参阅
“使用块游标”和
“使用可滚动游标
”。
创建结果集后,光标将定位在结果集的开头。
SQLFetchScroll
根据 FetchOrientation
和
FetchOffset
参数的值
定位块游标,如下表所示。 下一部分显示了用于确定新行集开始的确切规则。
FetchOrientation
驱动程序不需要支持所有提取方向;应用程序使用信息类型SQL_DYNAMIC_CURSOR_ATTRIBUTES1、SQL_KEYSET_CURSOR_ATTRIBUTES1或SQL_STATIC_CURSOR_ATTRIBUTES1(具体取决于游标的类型)调用
SQLGetInfo
,以确定驱动程序支持哪些提取方向。 应用程序应查看这些信息类型中的SQL_CA1_NEXT、SQL_CA1_RELATIVE、SQL_CA1_ABSOLUTE和WQL_CA1_BOOKMARK位掩码。 此外,如果游标仅向前且 FetchOrientation 不SQL_FETCH_NEXT,
则 SQLFetchScroll
将返回 SQLSTATE HY106(提取范围外的类型)。
SQL_ATTR_ROW_ARRAY_SIZE语句属性指定行集中的行数。 如果 SQLFetchScroll
提取的
行集与结果集的末尾重叠,
SQLFetchScroll
将返回部分行集。 也就是说,如果 S + R - 1 大于 L,其中 S 是要提取的行集的起始行,则 R 是行集大小,L 是结果集中的最后一行,则只有第一行 L - S + 1 行行集有效。 其余行为空,状态为SQL_ROW_NOROW。
在 SQLFetchScroll
返回后
,当前行是行集的第一行。
游标定位规则
以下部分介绍 FetchOrientation 的每个值的确切规则。 这些规则使用以下表示法。
[1]
SQLFetchScroll
返回 SQLSTATE 01S06(尝试提取结果集前返回第一行集)并SQL_SUCCESS_WITH_INFO。
[2] 如果自上一次调用提取行以来已更改行集大小,则这是新的行集大小。
SQL_FETCH_RELATIVE
以下规则适用。
新行集的第一行
CurrRowsetStart > 1 AND CurrRowsetStart + FetchOffset < 1 AND |FetchOffset | > RowsetSize
[3]
CurrRowsetStart > 1 AND CurrRowsetStart + FetchOffset < 1 AND |FetchOffset | <= RowsetSize
[3]
1
[2]
1 <= CurrRowsetStart + FetchOffset <= LastResultRow
CurrRowsetStart + FetchOffset
CurrRowsetStart + FetchOffset > LastResultRow
结束后 AND FetchOffset >= 0
[1]
SQLFetchScroll
返回与使用 FetchOrientation 设置为SQL_FETCH_ABSOLUTE调用的行集相同。 有关详细信息,请参阅“SQL_FETCH_ABSOLUTE”部分。
[2]
SQLFetchScroll
返回 SQLSTATE 01S06(尝试提取结果集前返回第一行集)并SQL_SUCCESS_WITH_INFO。
[3] 如果自上一次调用提取行以来已更改行集大小,则这是新的行集大小。
SQL_FETCH_ABSOLUTE
以下规则适用。
新行集的第一行
FetchOffset < 0 AND |FetchOffset | > LastResultRow AND |FetchOffset | <= RowsetSize
[2]
1
[1]
FetchOffset = 0
1 <= FetchOffset <= LastResultRow
FetchOffset
FetchOffset > LastResultRow
[1]
SQLFetchScroll
返回 SQLSTATE 01S06(尝试提取结果集前返回第一行集)并SQL_SUCCESS_WITH_INFO。
[2] 如果自上一次调用提取行以来已更改行集大小,则这是新的行集大小。
对动态游标执行的绝对提取无法提供所需的结果,因为动态游标中的行位置不确定。 此类操作等效于先提取后跟提取相对项;它不是原子操作,静态游标的绝对提取也是一种绝对提取。
SQL_FETCH_FIRST
以下规则适用。
新行集的第一行
有关书签的信息,请参阅
书签(ODBC)。
删除、添加和错误行对游标移动的影响
静态和键集驱动的游标有时会检测添加到结果集中的行,并删除从结果集中删除的行。 通过使用SQL_STATIC_CURSOR_ATTRIBUTES2和SQL_KEYSET_CURSOR_ATTRIBUTES2选项调用
SQLGetInfo
并查看SQL_CA2_SENSITIVITY_ADDITIONS、SQL_CA2_SENSITIVITY_DELETIONS和SQL_CA2_SENSITIVITY_UPDATES位掩码,应用程序将确定由特定驱动程序实现的游标是否执行此操作。 对于可以检测已删除行并删除它们的驱动程序,以下段落描述了此行为的影响。 对于可以检测已删除行但无法删除的驱动程序,删除不会影响游标移动,并且以下段落不适用。
如果游标检测到添加到结果集的行或删除从结果集中删除的行,则它似乎仅在提取数据时才检测到这些更改。 这包括在
将 FetchOrientation 设置为 SQL_FETCH_RELATIVE 的情况下调用 SQLFetchScroll
,并将 FetchOffset 设置为 0 以重新调用同一行集,但不包括使用 fOption 设置为SQL_REFRESH调用 SQLSetPos 的情况。 在后一种情况下,将刷新行集缓冲区中的数据,但不重新写入行,并且不会从结果集中删除已删除的行。 因此,当从当前行集中删除或插入行集时,游标不会修改行集缓冲区。 而是在提取以前包含已删除行或现在包含插入行的任何行集时检测更改。
// Fetch the next rowset.
SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);
// Delete third row of the rowset. Does not modify the rowset buffers.
SQLSetPos(hstmt, 3, SQL_DELETE, SQL_LOCK_NO_CHANGE);
// The third row has a status of SQL_ROW_DELETED after this call.
SQLSetPos(hstmt, 3, SQL_REFRESH, SQL_LOCK_NO_CHANGE);
// Refetch the same rowset. The third row is removed, replaced by what
// was previously the fourth row.
SQLFetchScroll(hstmt, SQL_FETCH_RELATIVE, 0);
当 SQLFetchScroll 返回相对于当前行集的位置的新行集(即 FetchOrientation SQL_FETCH_NEXT、SQL_FETCH_PRIOR或SQL_FETCH_RELATIVE)时,在计算新行集的起始位置时,它不包括对当前行集的更改。 但是,如果更改能够检测这些更改,则它确实包括当前行集之外的更改。 此外,当 SQLFetchScroll 返回一个新的行集,该行集的位置独立于当前行集(即 FetchOrientation 是SQL_FETCH_FIRST、SQL_FETCH_LAST、SQL_FETCH_ABSOLUTE或SQL_FETCH_BOOKMARK)时,它包括能够检测的所有更改,即使它们位于当前行集中也是如此。
确定新添加的行位于当前行集内还是外部时,将部分行集视为最后一个有效行结束;即行状态不SQL_ROW_NOROW的最后一行。 例如,假设游标能够检测新添加的行,当前行集是部分行集,应用程序会添加新行,游标会将这些行添加到结果集的末尾。 如果应用程序调用 将 FetchOrientation 设置为SQL_FETCH_NEXT的 SQLFetchScroll , 则 SQLFetchScroll 将返回从第一个新添加的行开始的行集。
例如,假设当前行集包含行 21 到 30 行,行集大小为 10,游标从结果集中删除的行,游标检测添加到结果集中的行。 下表显示了 SQLFetchScroll 在各种情况下返回的行。
FetchOffset
新建行集[1]
[1] 此列在插入或删除任何行之前使用行号。
[2] 在这种情况下,游标尝试返回以第 21 行开头的行。 由于第 21 行已被删除,因此返回的第一行为第 22 行。
错误行(即状态为SQL_ROW_ERROR的行)不会影响游标移动。 例如,如果当前行集以第 11 行开头,并且第 11 行的状态为SQL_ROW_ERROR,则调用 将 FETCHOrientation 设置为 SQL_FETCH_RELATIVE 且 FetchOffset 设置为 5 的 SQLFetchScroll 将返回以第 16 行开头的行集,就像第 11 行的状态SQL_SUCCESS一样。
返回绑定列中的数据
SQLFetchScroll 以与 SQLFetch 相同的方式返回绑定列中的数据。 有关详细信息,请参阅 SQLFetch 函数中的“返回绑定列中的数据”。
如果未绑定任何列, SQLFetchScroll 不会返回数据,但会将块游标移动到指定位置。 是否可以使用 SQLGetData 从块游标的未绑定列中检索数据取决于驱动程序。 如果对 SQLGetInfo 的调用返回SQL_GETDATA_EXTENSIONS信息类型的SQL_GD_BLOCK位,则支持此功能。
缓冲区地址
SQLFetchScroll 使用相同的公式来确定数据地址和长度/指示器缓冲区作为 SQLFetch。 有关详细信息,请参阅 SQLBindCol 函数中的“缓冲区地址”。
行状态数组
SQLFetchScroll 以与 SQLFetch 相同的方式设置行状态数组中的值。 有关详细信息,请参阅 SQLFetch 函数中的“行状态数组”。
提取的行缓冲区
SQLFetchScroll 以与 SQLFetch 相同的方式返回提取的行中提取的行数。 有关详细信息,请参阅 SQLFetch 函数中的“行提取缓冲区”。
当应用程序在 ODBC 3.x 驱动程序中调用 SQLFetchScroll 时,驱动程序管理器会在驱动程序中调用 SQLFetchScroll 。 当应用程序在 ODBC 2.x 驱动程序中调用 SQLFetchScroll 时,驱动程序管理器会在驱动程序中调用 SQLExtendedFetch。 由于 SQLFetchScroll 和 SQLExtendedFetch 以略有不同的方式处理错误,因此当应用程序在 ODBC 2.x 和 ODBC 3.x 驱动程序中调用 SQLFetchScroll 时会看到略有不同的错误行为。
SQLFetchScroll 以与 SQLFetch 相同的方式返回错误和警告;有关详细信息,请参阅 SQLFetch 中的“错误处理”。 SQLExtendedFetch 以与 SQLFetch 相同的方式返回错误,但有以下例外:
当发生应用于行集中特定行的警告时,SQLExtendedFetch 会将行状态数组中的相应条目设置为SQL_ROW_SUCCESS,而不是SQL_ROW_SUCCESS_WITH_INFO。
如果行集中的每一行中出现错误,SQLExtendedFetch 将返回SQL_SUCCESS_WITH_INFO,而不是SQL_ERROR。
在每个应用于单个行的状态记录组中,SQLExtendedFetch 返回的第一条状态记录必须包含 SQLSTATE 01S01(行错误): SQLFetchScroll 不返回此 SQLSTATE。 如果 SQLExtendedFetch 无法返回其他 SQLSTATE,它仍必须返回此 SQLSTATE。
如果游标使用乐观并发(即,SQL_ATTR_CONCURRENCY语句属性的值为 SQL_CONCUR_VALUES 或 SQL_CONCUR_ROWVER - SQLFetchScroll 将更新数据源用来检测行是否已更改的乐观并发值。 每当 SQLFetchScroll 提取新的行集(包括重新提取当前行集时)就会发生这种情况。 (调用 FetchOrientation 设置为 SQL_FETCH_RELATIVE,FetchOffset 设置为 0。
当应用程序在 ODBC 2.x 驱动程序中调用 SQLFetchScroll 时,驱动程序管理器会将此调用映射到 SQLExtendedFetch。 它为 SQLExtendedFetch 的参数传递以下值。
SQLExtendedFetch 参数
FetchOffset
如果未SQL_FETCH_BOOKMARK FetchOrientation,则使用 SQLFetchScroll 中的 FetchOffset 参数的值。
如果 FetchOrientation SQL_FETCH_BOOKMARK,则使用存储在 SQL_ATTR_FETCH_BOOKMARK_PTR 语句属性指定的地址处的值。
RowCountPtr
SQL_ATTR_ROWS_FETCHED_PTR语句属性指定的地址。
RowStatusArray
SQL_ATTR_ROW_STATUS_PTR语句属性指定的地址。
有关详细信息,请参阅“附录 G:驱动程序后向兼容性指南”中的块游标、可滚动游标和后向兼容性。
SQLFetchScroll 以与 SQLFetch 相同的方式与描述符交互。 有关详细信息,请参阅 SQLFetch 函数中的“描述符和 SQLFetchScroll”部分。
请参阅列明智绑定、行顺序绑定、定位的 Update 和 Delete 语句,以及使用 SQLSetPos 更新行集中的行。
有关以下内容的信息