SQLFetch 函数

一致性
引入的版本:ODBC 1.0 标准符合性:ISO 92

总结
SQLFetch 从结果集中提取下一行数据集,并返回所有绑定列的数据。

语法

  
SQLRETURN SQLFetch(  
     SQLHSTMT     StatementHandle);  

参数

StatementHandle
[输入]语句句柄。

返回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。

诊断

当 SQLFetch 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过使用 handleType of SQL_HANDLE_STMT 和 StatementHandle柄调用 SQLGetDiagRec 函数来获取关联的 SQLSTATE 值。 下表列出了 SQLFetch 通常返回的 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 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 为列返回的字符串或二进制数据导致非空字符或非 NULL 二进制数据的截断。 如果它是字符串值,则将其右截断。
01S01 行中的错误 提取一行或多行时出错。

(如果 ODBC 3*.x* 应用程序使用 ODBC 2*.x* 驱动程序时返回此 SQLSTATE,则可以忽略它。
01S07 小数截断 为列返回的数据被截断。 对于数值数据类型,数字的小数部分被截断。 对于包含时间组件的时间、时间戳和间隔数据类型,将截断时间的小数部分。

(函数返回SQL_SUCCESS_WITH_INFO。)
07006 受限数据类型属性冲突 结果集中列的数据值无法转换为 SQLBindColTargetType 指定的数据类型。

列 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列(或 SQLSetDescFieldSQLSetDescRec 设置的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 启用了异步处理。 调用了 SQLFetch 函数,在完成执行之前,对 StatementHandle 调用 SQLCancelSQLCancelHandle。 然后,在 StatementHandle再次调用 SQLFetch 函数。

或者,调用了 SQLFetch 函数,在完成执行之前,SQLCancel 或 SQLCancelHandle 从多线程应用程序中的不同线程调用了 StatementHandle
HY010 函数序列错误 (DM) 为与 StatementHandle 关联的连接句柄调用异步执行函数。 调用 SQLFetch 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用了 SQLExecuteSQLExecDirectSQLMoreResults,并返回了SQL_PARAM_DATA_AVAILABLE。 在检索所有流式处理参数的数据之前调用此函数。

(DM) 指定的 StatementHandle 未处于执行状态。 在未首先调用 SQLExecDirectSQLExecute 或目录函数的情况下调用该函数。

(DM) 为 StatementHandle 调用异步执行函数(而不是此函数),并在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用了 SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos,并返回了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字段中可用,可通过调用 获取SQLDescribeColSQLColAttributeSQLGetDescField。)
HY107 行值范围外 使用 SQL_ATTR_CURSOR_TYPE 语句属性指定的值SQL_CURSOR_KEYSET_DRIVEN,但使用 SQL_ATTR_KEYSET_SIZE 语句属性指定的值大于 0,小于使用 SQL_ATTR_ROW_ARRAY_SIZE 语句属性指定的值。
HY117 连接因未知事务状态而挂起。 仅允许断开连接和只读函数。 (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数
HYC00 未实现可选功能 驱动程序或数据源不支持由 SQLBindColTargetType 和相应列的 SQL 数据类型组合指定的转换。
HYT00 已超时 在数据源返回请求的结果集之前,查询超时期限已过期。 超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 超过连接超时时间 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,轮询将被禁用。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上的上一个异步操作。 如果句柄上的上一个函数调用返回SQL_STILL_EXECUTING并且启用通知模式, 则必须在句柄上调用 SQLCompleteAsync 才能执行后期处理并完成操作。

注释

SQLFetch 返回结果集中的下一行集。 只有在结果集存在时,才能调用它:即在创建结果集的调用之后,以及关闭该结果集上的游标之前。 如果绑定了任何列,它将返回这些列中的数据。 如果应用程序已指定指向行状态数组的指针或要在其中返回提取的行数的缓冲区, SQLFetch 还会返回此信息。 对 SQLFetch 的调用可以与对 SQLFetchScroll 的调用混合,但不能与对 SQLExtendedFetch调用混合。 有关详细信息,请参阅 提取数据行。

如果 ODBC 3*.x* 应用程序适用于 ODBC 2*.x* 驱动程序,驱动程序管理器会将 SQLFetch 调用映射到支持 SQLExtendedFetch 的 ODBC 2*.x* 驱动程序的 SQLExtendedFetch 如果 ODBC 2*.x* 驱动程序不支持 SQLExtendedFetch,驱动程序管理器会将 SQLFetch 调用映射到 ODBC 2*.x* 驱动程序中的 SQLFetch,该驱动程序只能提取一行。

有关详细信息,请参阅“附录 G:驱动程序后向兼容性指南”中的块游标、可滚动游标和后向兼容性

定位光标

创建结果集后,光标将定位在结果集的开头。 SQLFetch 提取下一行集。 它等效于使用 FetchOrientation 设置为SQL_FETCH_NEXT调用 SQLFetchScroll 有关游标的详细信息,请参阅 游标块游标

SQL_ATTR_ROW_ARRAY_SIZE语句属性指定行集中的行数。 如果 SQLFetch 提取的行集与结果集的末尾重叠,SQLFetch 将返回部分行集。 也就是说,如果 S + R - 1 大于 L,其中 S 是要提取的行集的起始行,则 R 是行集大小,L 是结果集中的最后一行,则只有第一行 L - S + 1 行行集有效。 其余行为空,状态为SQL_ROW_NOROW。

SQLFetch 返回后,当前行是行集的第一行。

下表中列出的规则根据本部分中第二个表中列出的条件描述对 SQLFetch 的调用后游标定位。

条件 新行集的第一行
开始之前 1
CurrRowsetStart<= LastResultRow - RowsetSize[1] CurrRowsetStart + RowsetSize[2]
CurrRowsetStart>LastResultRow - RowsetSize[1] 结束之后
结束之后 结束之后

[1] 如果在提取之间更改行集大小,则这是与上一个提取一起使用的行集大小。

[2] 如果在提取之间更改行集大小,则这是用于新提取的行集大小。

表示法 含义
开始之前 块游标位于结果集的开头之前。 如果新行集的第一行位于结果集的开头之前, SQLFetch 将返回SQL_NO_DATA。
结束之后 块游标位于结果集末尾之后。 如果新行集的第一行位于结果集末尾之后, SQLFetch 将返回SQL_NO_DATA。
CurrRowsetStart 当前行集中第一行的数目。
LastResultRow 结果集中最后一行的数目。
RowsetSize 行集大小。

例如,假设结果集有 100 行,行集大小为 5。 下表显示了 SQLFetch 为不同的起始位置返回的行集和返回代码。

当前行集 返回代码 新建行集 提取的行数
开始之前 SQL_SUCCESS 1 到 5 5
1 到 5 SQL_SUCCESS 6 到 10 5
52 到 56 SQL_SUCCESS 57 到 61 5
91 到 95 SQL_SUCCESS 96 到 100 5
93 到 97 SQL_SUCCESS 98 到 100。 行状态数组的第 4 行和第 5 行设置为SQL_ROW_NOROW。 3
96 到 100 SQL_NO_DATA 无。 0
99 到 100 SQL_NO_DATA 无。 0
结束之后 SQL_NO_DATA 无。 0

返回绑定列中的数据

SQLFetch 返回每一行时,它将每个绑定列的数据放入绑定到该列的缓冲区中。 如果未绑定列,SQLFetch 将不返回任何数据,但会向前移动块游标。 仍可使用 SQLGetData 检索数据。 如果游标是多行游标(即SQL_ATTR_ROW_ARRAY_SIZE大于 1),则仅当使用 infoType SQL_GETDATA_EXTENSIONS 调用 SQLGetInfo 时返回SQL_GD_BLOCK时,才能调用 SQLGetData。 (有关详细信息,请参阅 SQLGetData.)

对于行中的每个绑定列, SQLFetch 执行以下操作:

  1. 将长度/指示器缓冲区设置为SQL_NULL_DATA,如果数据为 NULL,则继续执行下一列。 如果数据为 NULL 且没有绑定长度/指示器缓冲区, 则 SQLFetch 将返回行的 SQLSTATE 22002(必需但未提供指示器变量),并继续执行下一行。 有关如何确定长度/指示器缓冲区的地址的信息,请参阅 SQLBindCol 中的“缓冲区地址”。

    如果列的数据不为 NULL, 则 SQLFetch 将继续执行步骤 2。

  2. 如果 SQL_ATTR_MAX_LENGTH 语句属性设置为非零值,并且列包含字符或二进制数据,则数据将被截断为SQL_ATTR_MAX_LENGTH字节。

    注意

    SQL_ATTR_MAX_LENGTH语句属性旨在减少网络流量。 它通常由数据源实现,该数据源在通过网络返回数据之前截断数据。 不支持驱动程序和数据源。 因此,为了保证数据被截断为特定大小,应用程序应分配该大小的缓冲区,并在 SQLBindCol 中的 cbValueMax 参数中指定大小。

  3. 将数据转换为 SQLBindColTargetType 指定的类型。

  4. 如果数据转换为可变长度数据类型(如字符或二进制数据), 则 SQLFetch 会检查数据的长度是否超过数据缓冲区的长度。 如果字符数据的长度(包括 null 终止字符)超过数据缓冲区的长度, 则 SQLFetch 会将数据截断为数据缓冲区的长度,减少 null 终止字符的长度。 然后,它会以 null 结尾数据。 如果二进制数据的长度超过数据缓冲区的长度, 则 SQLFetch 将其截断为数据缓冲区的长度。 在 SQLBindCol 中使用 BufferLength 指定数据缓冲区的长度。

    SQLFetch 永远不会截断转换为固定长度数据类型的数据;它始终假定数据缓冲区的长度是数据类型的大小。

  5. 将转换的(可能截断)数据放入数据缓冲区中。 有关如何确定数据缓冲区的地址的信息,请参阅 SQLBindCol 中的“缓冲区地址”。

  6. 将数据的长度放在长度/指示器缓冲区中。 如果指示器指针和长度指针都设置为同一缓冲区(与调用 SQLBindCol 一样),则会在缓冲区中写入有效数据的长度,SQL_NULL_DATA在缓冲区中写入 NULL 数据。 如果未绑定长度/指示器缓冲区, 则 SQLFetch 不返回长度。

    • 对于字符或二进制数据,这是转换后和截断之前的数据长度,因为数据缓冲区太小。 如果驱动程序在转换后无法确定数据的长度,有时与长数据的情况一样,它将长度设置为SQL_NO_TOTAL。 如果由于SQL_ATTR_MAX_LENGTH语句属性而截断数据,则此属性的值将放入长度/指示器缓冲区而不是实际长度中。 这是因为此属性旨在在转换之前截断服务器上的数据,以便驱动程序无法确定实际长度。

    • 对于所有其他数据类型,这是转换后数据的长度;也就是说,它是数据转换为的类型的大小。

    有关如何确定长度/指示器缓冲区的地址的信息,请参阅 SQLBindCol 中的“缓冲区地址”。

  7. 如果在转换期间截断数据而不丢失有效数字(例如,转换时实数 1.234 将被截断为整数 1), 则 SQLFetch 返回 SQLSTATE 01S07(小数截断)和SQL_SUCCESS_WITH_INFO。 如果由于数据缓冲区的长度太小(例如,字符串“abcdef”放入 4 字节缓冲区中)而截断数据, 则 SQLFetch 返回 SQLSTATE 01004(数据截断)和SQL_SUCCESS_WITH_INFO。 如果由于SQL_ATTR_MAX_LENGTH语句属性而截断数据, SQLFetch 将返回SQL_SUCCESS,并且不返回 SQLSTATE 01S07(小数截断)或 SQLSTATE 01004(数据截断)。 如果在转换期间截断数据并丢失了有效数字(例如,如果SQL_INTEGER值大于 100,000 已转换为 SQL_C_TINYINT), 则 SQLFetch 将返回 SQLSTATE 22003(数值超出范围),SQL_ERROR(如果行集大小为 1)或SQL_SUCCESS_WITH_INFO(如果行集大小大于 1)。

如果 SQLFetch 或 SQLFetchScroll 未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则绑定数据缓冲区和长度/指示器缓冲区的内容是未定义的。

行状态数组

行状态数组用于返回行集中每一行的状态。 此数组的地址是使用 SQL_ATTR_ROW_STATUS_PTR 语句属性指定的。 数组由应用程序分配,并且必须具有SQL_ATTR_ROW_ARRAY_SIZE语句属性指定的元素数。 其值由 SQLFetch、SQLFetchScrollSQLBulkOperationsSQLSetPos 设置(除非在游标定位到 SQLExtendedFetch 之后调用它们)。 如果 SQL_ATTR_ROW_STATUS_PTR 语句属性的值是空指针,则这些函数不会返回行状态。

如果 SQLFetch 或 SQLFetchScroll 未返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则行状态数组缓冲区的内容是未定义的。

行状态数组中返回以下值。

行状态数组值 说明
SQL_ROW_SUCCESS 该行已成功提取,并且自上次从此结果集中提取以来未更改。
SQL_ROW_SUCCESS_WITH_INFO 该行已成功提取,并且自上次从此结果集中提取以来未更改。 但是,返回了有关该行的警告。
SQL_ROW_ERROR 提取该行时出现错误。
SQL_ROW_UPDATED[1]、[2]和 [3] 该行已成功提取,自上次从此结果集中提取后已更改。 如果从此结果集中再次提取该行或由 SQLSetPos 刷新,状态将更改为行的新状态。
SQL_ROW_DELETED[3] 自上次从此结果集中提取该行以来,该行已被删除。
SQL_ROW_ADDED[4] 该行由 SQLBulkOperations 插入。 如果行再次从此结果集中提取或由 SQLSetPos 刷新,则其状态为SQL_ROW_SUCCESS。
SQL_ROW_NOROW 行集与结果集的末尾重叠,并且没有返回与行状态数组的此元素对应的行。

[1] 对于键集、混合游标和动态游标,如果更新了键值,则数据行被视为已删除,并添加了一个新行。

[2] 某些驱动程序无法检测数据更新,因此无法返回此值。 若要确定驱动程序是否可以检测再次提取行的更新,应用程序可使用 SQL_ROW_UPDATES 选项调用 SQLGetInfo

[3] 仅当 SQLFetch 与对 SQLFetchScroll 的调用混合时,SQLFetch 才能返回此值。 这是因为 SQLFetch 会向前移动结果集,当它被独占使用时,不会重新引用任何行。 由于未重新调用任何行, 因此 SQLFetch 不会检测对以前提取的行所做的更改。 但是,如果 SQLFetchScroll 将游标置于任何以前提取的行之前,并且 SQLFetch 用于提取这些行, 则 SQLFetch 可以检测对这些行所做的任何更改。

[4] 仅 SQLBulkOperations 返回。 未由 SQLFetchSQLFetchScroll 设置。

提取的行缓冲区

提取的行缓冲区用于返回提取的行数,包括由于提取数据时出错而未返回数据的行数。 换句话说,它是行状态数组中值不SQL_ROW_NOROW的行数。 此缓冲区的地址是使用 SQL_ATTR_ROWS_FETCHED_PTR 语句属性指定的。 缓冲区由应用程序分配。 它由 SQLFetchSQLFetchScroll 设置。 如果 SQL_ATTR_ROWS_FETCHED_PTR 语句属性的值是空指针,则这些函数不会返回提取的行数。 若要确定结果集中当前行的数目,应用程序可以使用 SQL_ATTR_ROW_NUMBER 属性调用 SQLGetStmtAttr

如果 SQLFetch 或 SQLFetchScroll 不返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,则提取的缓冲区的内容是未定义的,除非返回SQL_NO_DATA,在这种情况下,提取缓冲区中的值设置为 0。

错误处理

错误和警告可以应用于单个行或整个函数。 有关诊断记录的详细信息,请参阅 DiagnosticsSQLGetDiagField

整个函数的错误和警告

如果错误适用于整个函数,例如 SQLSTATE HYT00 (超时已过期)或 SQLSTATE 24000 (游标状态无效), SQLFetch 将返回SQL_ERROR和适用的 SQLSTATE。 行集缓冲区的内容未定义,游标位置不变。

如果警告适用于整个函数, SQLFetch 将返回SQL_SUCCESS_WITH_INFO和适用的 SQLSTATE。 应用于整个函数的警告的状态记录在应用于单个行的状态记录之前返回。

各个行中的错误和警告

如果错误(如 SQLSTATE 22012(除以零)或警告(如 SQLSTATE 01004(数据截断)适用于单个行, SQLFetch将执行以下操作:

  • 将行状态数组的相应元素设置为SQL_ROW_ERROR错误或警告SQL_ROW_SUCCESS_WITH_INFO。

  • 为错误或警告添加包含 SQLSTATE 的零个或多个状态记录。

  • 设置状态记录中的行和列号字段。 如果 SQLFetch 无法确定行号或列号,则分别将该数字设置为SQL_ROW_NUMBER_UNKNOWN或SQL_COLUMN_NUMBER_UNKNOWN。 如果状态记录不适用于特定列, SQLFetch 会将列号设置为SQL_NO_COLUMN_NUMBER。

SQLFetch 会继续提取行,直到提取行集中的所有行。 除非在行集的每一行(不包括状态为SQL_ROW_NOROW的行)中出现错误,否则它将返回SQL_ERROR SQL_SUCCESS_WITH_INFO。 具体而言,如果行集大小为 1,并且该行中出现错误, 则 SQLFetch 将返回SQL_ERROR。

SQLFetch 按行号顺序返回状态记录。 也就是说,它返回未知行的所有状态记录(如果有):接下来,它将返回第一行的所有状态记录(如果有),然后返回第二行的所有状态记录(如果有),依此返回。 每行的状态记录根据排序状态记录的正常规则进行排序;有关详细信息,请参阅 SQLGetDiagField 中的“状态记录序列”。

描述符和 SQLFetch

以下部分介绍了 SQLFetch 如何与描述符交互。

参数映射

驱动程序不基于 SQLFetch 的参数设置任何描述符字段。

其他描述符字段

SQLFetch 使用以下描述符字段。

描述符字段 Desc. 设置通
SQL_DESC_ARRAY_SIZE ARD 头文件 SQL_ATTR_ROW_ARRAY_SIZE语句属性
SQL_DESC_ARRAY_STATUS_PTR IRD 头文件 SQL_ATTR_ROW_STATUS_PTR 语句属性
SQL_DESC_BIND_OFFSET_PTR ARD 头文件 SQL_ATTR_ROW_BIND_OFFSET_PTR 语句属性
SQL_DESC_BIND_TYPE ARD 头文件 SQL_ATTR_ROW_BIND_TYPE 语句属性
SQL_DESC_COUNT ARD 头文件 SQLBindCol 的 ColumnNumber 参数
SQL_DESC_DATA_PTR ARD 记录 SQLBindCol 的 TargetValuePtr 参数
SQL_DESC_INDICATOR_PTR ARD 记录 SQLBindCol 中的StrLen_or_IndPtr参数
SQL_DESC_OCTET_LENGTH ARD 记录 SQLBindCol 中的 BufferLength 参数
SQL_DESC_OCTET_LENGTH_PTR ARD 记录 SQLBindCol 中的StrLen_or_IndPtr参数
SQL_DESC_ROWS_PROCESSED_PTR IRD 头文件 SQL_ATTR_ROWS_FETCHED_PTR 语句属性
SQL_DESC_TYPE ARD 记录 SQLBindCol 中的 TargetType 参数

还可以通过 SQLSetDescField 设置所有描述符字段。

单独的长度和指示器缓冲区

应用程序可以绑定单个缓冲区或两个单独的缓冲区,这些缓冲区可用于保存长度和指示器值。 当应用程序调用 SQLBindCol 时,驱动程序会将 ARD 的SQL_DESC_OCTET_LENGTH_PTR和SQL_DESC_INDICATOR_PTR字段设置为同一地址,该地址在StrLen_or_IndPtr参数中传递。 当应用程序调用 SQLSetDescFieldSQLSetDescRec 时,可以将这两个字段设置为不同的地址。

SQLFetch 确定应用程序是否指定了单独的长度和指示器缓冲区。 在这种情况下,当数据不为 NULL 时, SQLFetch 会将指示器缓冲区设置为 0,并返回长度缓冲区中的长度。 当数据为 NULL 时, SQLFetch 会将指示器缓冲区设置为SQL_NULL_DATA,并且不会修改长度缓冲区。

代码示例

请参阅 SQLBindColSQLColumnsSQLGetDataSQLProcedures

有关以下内容的信息 请参阅
将缓冲区绑定到结果集中的列 SQLBindCol 函数
取消语句处理 SQLCancel 函数
返回有关结果集中的列的信息 SQLDescribeCol 函数
执行 SQL 语句 SQLExecDirect 函数
执行准备的 SQL 语句 SQLExecute 函数
提取数据块或滚动结果集 SQLFetchScroll 函数
关闭语句上的游标 SQLFreeStmt 函数
提取部分或全部数据列 SQLGetData 函数
返回结果集列数 SQLNumResultCols 函数
准备语句以供执行 SQLPrepare 函数

另请参阅

ODBC API 参考
ODBC 头文件