SQLExtendedFetch 函数
一致性
引入的版本:ODBC 1.0 标准符合性:已弃用
总结
SQLExtendedFetch 从结果集中提取指定的数据行集,并返回所有绑定列的数据。 行集可以在绝对位置或相对位置或通过书签指定。
注意
在 ODBC 3*.x* 中, SQLExtendedFetch 已替换为 SQLFetchScroll。 ODBC 3*.x* 应用程序不应调用 SQLExtendedFetch;而是应调用 SQLFetchScroll。 驱动程序管理器 使用 ODBC 2*.x* 驱动程序时,将 SQLFetchScroll 映射到 SQLExtendedFetch 。 如果 ODBC 3*.x* 驱动程序想要使用调用它的 ODBC 2*.x* 应用程序,则应支持 SQLExtendedFetch 。 有关详细信息,请参阅附录 G 中的“注释”和 块游标、可滚动游标和向后兼容性:驱动程序向后兼容性 指南。
语法
SQLRETURN SQLExtendedFetch(
SQLHSTMT StatementHandle,
SQLUSMALLINT FetchOrientation,
SQLLEN FetchOffset,
SQLULEN * RowCountPtr,
SQLUSMALLINT * RowStatusArray);
参数
StatementHandle
[输入]语句句柄。
FetchOrientation
[输入]提取的类型。 这与 SQLFetchScroll 中的 FetchOrientation 相同。
FetchOffset
[输入]要提取的行数。 这与 SQLFetchScroll 中的 FetchOffset 相同,但有一个例外。 当 FetchOrientation SQL_FETCH_BOOKMARK时,FetchOffset 是固定长度的书签,而不是书签的偏移量。 换句话说, SQLExtendedFetch 从此参数中检索书签,而不是 SQL_ATTR_FETCH_BOOKMARK_PTR 语句属性。 它不支持可变长度的书签,并且不支持从书签的偏移量(0 以外的)提取行集。
RowCountPtr
[输出]指向要返回实际提取的行数的缓冲区的指针。 此缓冲区的使用方式与SQL_ATTR_ROWS_FETCHED_PTR语句属性指定的缓冲区相同。 此缓冲区仅由 SQLExtendedFetch 使用。 SQLFetch 或 SQLFetchScroll 不使用它。
RowStatusArray
[输出]指向要返回每行状态的数组的指针。 此数组的使用方式与 SQL_ATTR_ROW_STATUS_PTR 语句属性指定的数组相同。
但是,此数组的地址不存储在 IRD 的SQL_DESC_STATUS_ARRAY_PTR字段中。 此外,仅 SQLExtendedFetch 和 SQLBulkOperations 使用 SQLExtendedFetch 和 SQLBulkOperations 在 SQLExtendedFetch 之后调用该数组时,该数组的运算为 SQL_ADD 或 SQLSetPos。 SQLFetch 或 SQLFetchScroll 不使用它,在 SQLFetch 或 SQLFetchScroll 后调用 SQLFetch 或 SQLFetchScroll 时,SQLBulkOperations 或 SQLSetPos 不使用 SQLBulkOperations。 在调用任何提取函数之前调用具有SQL_ADD操作的 SQLBulkOperations 时,也不会使用它。 换句话说,它仅在语句状态 S7 中使用。 语句中未使用 S5 或 S6。 有关详细信息,请参阅 附录 B 中的语句转换 :ODBC 状态转换表。
应用程序应在 RowStatusArray 参数中提供有效的指针;否则,SQLExtendedFetch 的行为以及 SQLBulkOperations 或 SQLSetPos 的调用行为在 SQLExtendedFetch 定位游标后的行为是未定义的。
返回
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。
诊断
当 SQLExtendedFetch 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过调用 SQLError 来获取关联的 SQLSTATE 值。 下表列出了 SQLExtendedFetch 通常返回的 SQLSTATE 值,并解释此函数上下文中的每个值;表示法“(DM)”位于驱动程序管理器返回的 SQLSTATE 的说明之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。 如果在单个列中发生错误,则可以使用SQL_DIAG_COLUMN_NUMBER的 DiagIdentifier 调用 SQLGetDiagField 以确定发生错误的列;可以使用SQL_DIAG_ROW_NUMBER的 DiagIdentifier 调用 SQLGetDiagField 以确定包含该列的行。
SQLSTATE | 错误 | 说明 |
---|---|---|
01000 | 常规警告 | 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。) |
01004 | 字符串数据,右截断 | 为列返回的字符串或二进制数据导致非空字符或非 NULL 二进制数据的截断。 如果它是字符串值,则将其右截断。 如果它是数值,则数字的小数部分被截断。 (函数返回SQL_SUCCESS_WITH_INFO。) |
01S01 | 行中的错误 | 提取一行或多行时出错。 (函数返回SQL_SUCCESS_WITH_INFO。) |
01S06 | 在结果集返回第一个行集之前尝试提取 | 当当前位置超出第一行时,请求的行集与结果集的开始重叠,并且 FetchOrientation SQL_PRIOR或 FetchOrientation SQL_RELATIVE,其绝对值小于或等于当前SQL_ROWSET_SIZE。 (函数返回SQL_SUCCESS_WITH_INFO。) |
01S07 | 小数截断 | 为列返回的数据被截断。 对于数值数据类型,数字的小数部分被截断。 对于包含时间分量的时间、时间戳和间隔数据类型,时间的小数部分被截断。 (函数返回SQL_SUCCESS_WITH_INFO。) |
07006 | 受限数据类型属性冲突 | 无法将数据值转换为 SQLBindCol 中 TargetType 指定的 C 数据类型。 |
07009 | 描述符索引无效 | 列 0 与 SQLBindCol 绑定,SQL_ATTR_USE_BOOKMARKS语句属性设置为SQL_UB_OFF。 |
08S01 | 通信链接失败 | 驱动程序与驱动程序连接到的数据源之间的通信链接在函数完成处理之前失败。 |
22002 | 指示符变量是必需的,但未提供 | NULL 数据已提取到 SQLBindCol 设置StrLen_or_IndPtr为空指针的列中。 (函数返回SQL_SUCCESS_WITH_INFO。) |
22003 | 数值范围之外 | 返回一个或多个列的数值(作为数字或字符串),将导致截断数字的整个(而不是小数部分)。 (函数返回SQL_SUCCESS_WITH_INFO。) 有关详细信息,请参阅 附录 D:数据类型中的间隔和数值数据类型 指南。 |
22007 | 日期/时间格式无效 | 结果集中的字符列绑定到日期、时间或时间戳 C 结构,并且列中的值分别是无效的日期、时间或时间戳。 (函数返回SQL_SUCCESS_WITH_INFO。) |
22012 | 被零除 | 返回算术表达式中的值,这导致除以零。 (函数返回SQL_SUCCESS_WITH_INFO。) |
22015 | 间隔字段溢出 | 从确切的数字或间隔 SQL 类型分配给间隔 C 类型会导致前导字段中的有效数字丢失。 将数据提取到间隔 C 类型时,间隔 C 类型中没有 SQL 类型的值表示形式。 (函数返回SQL_SUCCESS_WITH_INFO。) |
22018 | 强制转换规范的字符值无效 | C 类型是精确或近似数字、日期/时间或间隔数据类型;列的 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。 (函数返回SQL_SUCCESS_WITH_INFO。) |
24000 | 游标状态无效 | StatementHandle 处于执行状态,但没有结果集与 StatementHandle 相关联。 |
HY000 | 常规错误 | 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLError 返回的错误消息描述错误及其原因。 |
HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成函数所需的内存。 |
HY008 | 操作已取消 | 为 StatementHandle 启用了异步处理。 调用了该函数,在完成执行之前,对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle,然后在 StatementHandle 上再次调用该函数。 调用了函数,在完成执行之前,SQLCancel 或 SQLCancelHandle 从多线程应用程序中的不同线程调用 StatementHandle。 |
HY010 | 函数序列错误 | (DM) 为与 StatementHandle 关联的连接句柄调用异步执行函数。 调用 SQLExtendedFetch 函数时,此异步函数仍在执行。 (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) 在调用 SQLFetch 或 SQLFetchScroll 以及使用 SQL_CLOSE 选项调用 SQLFreeStmt 之前,为 StatementHandle 调用 SQLExtendedFetch。 (DM) 在调用 SQLFetch、SQLFetchScroll 或 SQLExtendedFetch 之前调用 SQLBulkOperations,然后在调用 SQLFreeStmt 之前调用 SQLExtendedFetch,并使用SQL_CLOSE选项调用 SQLExtendedFetch。 |
HY013 | 内存管理错误 | 无法处理函数调用,因为基础内存对象无法访问,可能是因为内存条件低。 |
HY106 | 从范围中提取类型 | (DM) 为参数 FetchOrientation 指定的值无效。 (请参阅“注释”。 参数 FetchOrientation 已SQL_FETCH_BOOKMARK,SQL_ATTR_USE_BOOKMARKS 语句属性设置为SQL_UB_OFF。 SQL_CURSOR_TYPE语句选项的值SQL_CURSOR_FORWARD_ONLY,参数 FetchOrientation 的值未SQL_FETCH_NEXT。 参数 FetchOrientation 已SQL_FETCH_RESUME。 |
HY107 | 行值范围外 | 使用 SQL_CURSOR_TYPE 语句选项指定的值SQL_CURSOR_KEYSET_DRIVEN,但使用 SQL_KEYSET_SIZE 语句属性指定的值大于 0,小于使用 SQL_ROWSET_SIZE 语句属性指定的值。 |
HY111 | 书签值无效 | 参数 FetchOrientation SQL_FETCH_BOOKMARK,FetchOffset 参数中指定的书签无效。 |
HY117 | 连接因未知事务状态而挂起。 仅允许断开连接和只读函数。 | (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数。 |
HYC00 | 未实现可选功能 | 驱动程序或数据源不支持指定的提取类型。 驱动程序或数据源不支持由 SQLBindCol 中 TargetType 和相应列的 SQL 数据类型组合指定的转换。 此错误仅适用于将列的 SQL 数据类型映射到特定于驱动程序的 SQL 数据类型时。 |
HYT00 | 已超时 | 在数据源返回结果集之前,查询超时期限已过期。 超时期限通过 SQLSetStmtOption 设置,SQL_QUERY_TIMEOUT。 |
HYT01 | 超过连接超时时间 | 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。 |
IM001 | 驱动程序不支持此函数 | (DM) 与 StatementHandle 关联的驱动程序不支持该函数。 |
注释
SQLExtendedFetch 的行为与 SQLFetchScroll 的行为相同,但有以下例外:
SQLExtendedFetch 和 SQLFetchScroll 使用不同的方法返回提取的行数。 SQLExtendedFetch 返回 *RowCountPtr 中提取的行数; SQLFetchScroll 返回直接提取到SQL_ATTR_ROWS_FETCHED_PTR指向的缓冲区的行数。 有关详细信息,请参阅 RowCountPtr 参数。
SQLExtendedFetch 和 SQLFetchScroll 返回不同数组中每一行的状态。 有关详细信息,请参阅 RowStatusArray 参数。
当 FetchOrientation SQL_FETCH_BOOKMARK时,SQLExtendedFetch 和 SQLFetchScroll 使用不同的方法来检索书签。 SQLExtendedFetch 不支持可变长度的书签,也不支持从书签中获取除 0 以外的偏移量提取行集。 有关详细信息,请参阅 FetchOffset 参数。
SQLExtendedFetch 和 SQLFetchScroll 使用不同的行集大小。 SQLExtendedFetch 使用 SQL_ROWSET_SIZE 语句属性的值,SQLFetchScroll 使用 SQL_ATTR_ROW_ARRAY_SIZE 语句属性的值。
SQLExtendedFetch 的错误处理语义与 SQLFetchScroll 略有不同。 有关详细信息,请参阅 SQLFetchScroll 的“注释”部分中的“错误处理”。
SQLExtendedFetch 不支持绑定偏移量(SQL_ATTR_ROW_BIND_OFFSET_PTR语句属性)。
对 SQLExtendedFetch 的调用不能与对 SQLFetch 或 SQLFetchScroll 的调用混合,如果在调用任何提取函数之前调用 SQLBulkOperations,则在游标关闭并重新打开之前,不能调用 SQLExtendedFetch。 也就是说, 只能在语句状态 S7 中调用 SQLExtendedFetch 。 有关详细信息,请参阅 附录 B 中的语句转换 :ODBC 状态转换表。
当应用程序在使用 ODBC 2*.x* 驱动程序时调用 SQLFetchScroll 时,驱动程序管理器会将此调用映射到 SQLExtendedFetch。 有关详细信息,请参阅 SQLFetchScroll 中的“SQLFetchScroll 和 ODBC 2*.x* 驱动程序”。
在 ODBC 2*.x* 中, 调用 SQLExtendedFetch 提取多行,并 调用 SQLFetch 来提取单个行。 另一方面,在 ODBC 3*.x* 中, 可以调用 SQLFetch 来提取多行。
相关函数
有关以下内容的信息 | 请参阅 |
---|---|
将缓冲区绑定到结果集中的列 | SQLBindCol 函数 |
执行批量插入、更新或删除操作 | SQLBulkOperations 函数 |
取消语句处理 | SQLCancel 函数 |
返回有关结果集中的列的信息 | SQLDescribeCol 函数 |
执行 SQL 语句 | SQLExecDirect 函数 |
执行准备的 SQL 语句 | SQLExecute 函数 |
返回结果集列数 | SQLNumResultCols 函数 |
定位游标、刷新行集中的数据或更新或删除结果集中的数据 | SQLSetPos 函数 |
设置语句属性 | SQLSetStmtAttr 函数 |