SQL Server SQLFetch()
{
/*
摘要
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 时, 可以通过使用SQLGetDiagRec 的 HandleType和 SQL_HANDLE_STMT 的句柄调用StatementHandle 函数来获取关联的 SQLSTATE 值。 下表列出了通常由SQLFetch返回的 SQLSTATE 值, 并对该函数的上下文中的每个值进行了说明:"(DM)" 表示法位于驱动程序管理器返回的 SQLSTATEs 的说明之前。 除非另有说明, 否则与每个 SQLSTATE 值相关联的返回代码为 SQL_ERROR。 如果对单个列发生错误, 则可以使用 SQL_DIAG_COLUMN_NUMBER 的DiagIdentifier调用SQLGetDiagField , 以确定发生错误的列;可以使用 SQL_DIAG_ROW_NUMBER 的DiagIdentifier调用和SQLGetDiagField来确定包含该列的行。
对于可以返回 SQL_SUCCESS_WITH_INFO 或
SQL_ERROR 的所有 SQLSTATEs (除了 01xxx SQLSTATEs), 如果在一个或多个 (但不是全部) 行上发生错误,
则将返回 SQL_SUCCESS_WITH_INFO; 如果发生错误, 则返回多行单行操作。
SQLSTATE | Error | 描述 |
---|---|---|
01000 | 一般警告 | 驱动程序特定的信息性消息。 (函数返回 SQL_SUCCESS_WITH_INFO。) |
01004 | 字符串数据, 右截断 | 为列返回的字符串或二进制数据导致截断非空白字符或非空的二进制数据。 如果它是一个字符串值, 则它将被右截断。 |
01S01 | 行中的错误 | 提取一行或多行时出错。
(如果在 ODBC3.x 应用程序使用 odbc2.x 驱动程序时返回此 SQLSTATE, 则可以将其忽略。) |
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的 ODBC2.x 驱动程序, 并且在绑定中为列指定的列号为0。
已绑定列 0, 并且 SQL_ATTR_USE_BOOKMARKS 语句属性设置为 SQL_UB_OFF。 |
08S01 | 通信链接失败 | 在函数完成处理之前, 驱动程序与连接到的数据源之间的通信链接失败。 |
22001 | 字符串数据, 右截断 | 为列返回的可变长度书签已截断。 |
22002 | 需要指示器变量, 但未提供 | NULL 数据提取到StrLen_or_IndPtr设置的列中, SQLBINDCOL (或 SQL_DESC_INDICATOR_PTR 通过SQLSetDescField或SQLSetDescRec设置) 为 null 指针。 |
22003 | 数值超出范围 | 对于一个或多个绑定列, 将数值返回为数值或字符串, 将导致数字的整个 (而不是小数) 部分被截断。
有关详细信息, 请参阅附录D:数据类型。 |
22007 | Datetime 格式无效 | 结果集中的字符列已绑定到日期、时间或时间戳 C 结构, 列中的值分别为无效的日期、时间或时间戳。 |
22012 | 被零除 | 返回了算术表达式中的值, 从而导致被零除。 |
22015 | 间隔字段溢出 | 从精确数值或间隔 SQL 类型赋值到 interval C 类型会导致前导字段的有效位丢失。
将数据提取到 interval C 类型时, interval C 类型中没有 SQL 类型的值的表示形式。 |
22018 | 转换规范的字符值无效 | 结果集中的字符列已绑定到字符 C 缓冲区, 列包含的字符在缓冲区的字符集中没有表示形式。
C 类型是精确或近似数字、日期时间或间隔数据类型;列的 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。 |
24000 | 无效的游标状态 | StatementHandle处于已执行状态, 但没有与StatementHandle关联的结果集。 |
40001 | 序列化失败 | 执行提取的事务已终止, 以防止死锁。 |
40003 | 语句完成情况未知 | 在执行此函数的过程中关联的连接失败, 无法确定事务的状态。 |
HY000 | 一般错误 | 发生了一个错误, 该错误没有特定的 SQLSTATE, 没有为其定义实现特定的 SQLSTATE。 MessageText 缓冲区中的 SQLGetDiagRec返回的错误消息描述了错误及其原因。 * |
HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成此函数所需的内存。 |
HY008 | 操作已取消 | 已为StatementHandle启用异步处理。 调用SQLFetch函数, 并在其完成执行之前, 对StatementHandle调用SQLCancel或SQLCancelHandle 。 然后, 在StatementHandle上再次调用SQLFetch函数。
或者, 在执行完SQLFetch函数之前, 从多线程应用程序中的另一个线程调用StatementHandle上的SQLCancel或SQLCancelHandle 。 |
HY010 | 函数序列错误 | (DM) 为与StatementHandle关联的连接句柄调用了异步执行的函数。 调用SQLFetch函数时, 此异步函数仍在执行。
(DM) 为StatementHandle调用了SQLExecute、 SQLExecDirect或SQLMoreResults , 并返回了 SQL_PARAM_DATA_AVAILABLE。 在检索所有流式处理参数的数据之前调用此函数。 (DM) 指定的StatementHandle未处于执行状态。 调用函数时, 无需先调用SQLExecDirect、 SQLExecute或 catalog 函数。 (DM) 为StatementHandle调用了异步执行的函数 (而不是此函数), 并且在调用此函数时仍在执行。 (DM) SQLExecute、 SQLExecDirect、 SQLBulkOperations或SQLSETPOS调用了StatementHandle并返回了 SQL_NEED_DATA。 在为所有执行时数据参数或列发送数据之前, 将调用此函数。 (DM) 在调用SQLExtendedFetch后, 调用了StatementHandle SQLFETCH , 并调用了 SQL_CLOSE 选项SQLFreeStmt 。 |
HY013 | 内存管理错误 | 未能处理函数调用, 原因可能是由于内存不足而无法访问基础内存对象。 |
HY090 | 字符串或缓冲区长度无效 | SQL_ATTR_USE_BOOKMARK 语句特性设置为 SQL_UB_VARIABLE, 而列0绑定到的缓冲区的长度不等于此结果集的书签的最大长度。 (此长度在 IRD 的 SQL_DESC_OCTET_LENGTH 字段中提供, 可以通过调用SQLDescribeCol、 SQLColAttribute或SQLGetDescField获取。) |
HY107 | 行值超出范围 | 用 SQL_ATTR_CURSOR_TYPE 语句特性指定的值为 SQL_CURSOR_KEYSET_DRIVEN, 但通过 SQL_ATTR_KEYSET_SIZE 语句特性指定的值大于0且小于用 SQL_ATTR_ROW_ARRAY_ 指定的值SIZE 语句特性。 |
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 , 才能执行后处理并完成操作。 |
注释
SQLFetch返回结果集中的下一个行集。 它只能在结果集存在时调用: 即, 在创建结果集的调用之后, 在该结果集上的游标结束之前。 如果绑定了任何列, 则它会返回这些列中的数据。 如果应用程序已指定一个指向行状态数组或缓冲区的指针 (在其中返回提取的行数), SQLFetch也将返回此信息。 对SQLFetch的调用可以与对SQLFetchScroll的调用混合, 但不能与对SQLExtendedFetch的调用混合。 有关详细信息, 请参阅提取数据行。
如果 ODBC1.x 应用程序适用于 odbc2.x 驱动程序, 则驱动程序管理器会将SQLFetch调用映射到支持SQLExtendedFetch的 odbc 2.x驱动程序的SQLExtendedFetch 。 如果 ODBC2.x 驱动程序不支持SQLExtendedFetch, 则驱动程序管理器会将SQLFetch调用映射到 ODBC2.x 驱动程序中的SQLFetch , 该驱动程序只能提取一行。
有关详细信息, 请参阅附录 G 中的块游标、可滚动游标和后向兼容性:向后兼容的驱动程序准则。
定位光标
创建结果集时, 游标将定位在结果集的开始位置之前。 SQLFetch提取下一个行集。 它等效于调用SQLFetchScroll , 并将FETCHORIENTATION设置为 SQL_FETCH_NEXT。 有关游标的详细信息, 请参阅游标和块游标。
SQL_ATTR_ROW_ARRAY_SIZE 语句特性指定行集中的行数。 如果SQLFetch提取的行集与结果集的末尾重叠, 则SQLFetch将返回部分行集。 也就是说, 如果 S + R-1 大于 L, 其中 S 是要提取的行集的起始行, 则 R 是行集的大小, L 是结果集中的最后一行, 则仅行集的第一 L + 1 行是有效的。 其余行为空, 状态为 "SQL_ROW_NOROW"。
SQLFetch返回后, 当前行是行集的第一行。
下表中列出的规则根据此部分的第二个表中列出的条件, 描述了调用SQLFetch后的游标定位。
条件 | 新行集的第一行 |
---|---|
开始之前 | 1 |
CurrRowsetStartLastResultRow-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), 则只有当使用SQLGetInfo 的 InfoType调用SQL_GETDATA_EXTENSIONS时, 才能调用SQLGetData 。 (有关详细信息, 请参阅SQLGetData。)
对于行中的每个绑定列, SQLFetch执行以下操作:
将长度/指示器缓冲区设置为 SQL_NULL_DATA, 如果数据为 NULL, 则转到下一列。 如果数据为空且未绑定长度/指示器缓冲区, 则SQLFetch将返回行的 SQLSTATE 22002 (需要指示器变量, 但未提供), 并转到下一行。 有关如何确定长度/指示器缓冲区的地址的信息, 请参阅SQLBindCol中的 "缓冲区地址"。
如果列的数据不为 NULL, 则SQLFetch将继续执行步骤2。
如果 SQL_ATTR_MAX_LENGTH 语句特性设置为非零值, 并且列包含字符或二进制数据, 则数据将被截断为 SQL_ATTR_MAX_LENGTH 字节。
备注
SQL_ATTR_MAX_LENGTH 语句特性旨在减少网络流量。 它通常由数据源实现, 该数据源通过网络返回数据之前将其截断。 驱动程序和数据源不需要支持。 因此, 若要保证数据被截断到特定大小, 应用程序应分配该大小的缓冲区, 并在SQLBindCol的cbValueMax参数中指定大小。
将数据转换为SQLBindCol中由TargetType指定的类型。
如果将数据转换为可变长度的数据类型 (如字符或二进制), SQLFetch会检查数据长度是否超过数据缓冲区的长度。 如果字符数据的长度 (包括 null 终止字符) 超过了数据缓冲区的长度, 则SQLFetch会将数据截断到数据缓冲区长度减去 null 终止字符的长度。 然后, 它将终止数据。 如果二进制数据的长度超过数据缓冲区的长度, 则SQLFetch会将其截断为数据缓冲区的长度。 数据缓冲区的长度是通过SQLBindCol中的BufferLength指定的。
SQLFetch从不截断转换为固定长度数据类型的数据;它始终假定数据缓冲区的长度为数据类型的大小。
将转换后的数据 (可能截断后的数据) 放入数据缓冲区。 有关如何确定数据缓冲区的地址的信息, 请参阅SQLBindCol中的 "缓冲区地址"。
将数据的长度放入长度/指示器缓冲区。 如果指示器指针和长度指针均设置为同一个缓冲区 (作为对SQLBindCol的调用), 则在缓冲区中写入有效数据的长度, 并且在缓冲区中写入 NULL 数据。 如果没有绑定长度/指示器缓冲区, 则SQLFetch不返回长度。
对于字符或二进制数据, 这是转换后的数据长度, 在截断之前, 因为数据缓冲区太小。 如果驱动程序在转换后无法确定数据的长度, 有时会出现长数据的情况, 它会将长度设置为 SQL_NO_TOTAL。 如果由于 SQL_ATTR_MAX_LENGTH 语句特性而导致数据被截断, 则此属性的值将放入长度/指示器缓冲区而不是实际长度中。 这是因为该属性设计为在转换前截断服务器上的数据, 以便驱动程序无法确定实际长度。
对于所有其他数据类型, 这是转换后的数据长度;也就是说, 它是数据转换到的类型的大小。
有关如何确定长度/指示器缓冲区的地址的信息, 请参阅SQLBindCol中的 "缓冲区地址"。
如果在转换过程中数据被截断 (例如, 在转换时将实数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 (数据截断)。 如果在转换过程中数据被截断 (例如, 如果将大于100000的 SQL_INTEGER 值转换为 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、 SQLFetchScroll和SQLBulkOperations或SQLSetPos设置 (在游标由SQLExtendedFetch定位后调用时除外)。 如果 SQL_ATTR_ROW_STATUS_PTR 语句特性的值为 null 指针, 则这些函数不返回行状态。
如果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不检测对以前提取的行所做的更改。 但是, 如果SQLFetchScroll将游标定位在之前提取的行之前, 并使用SQLFetch提取这些行, 则SQLFetch可以检测对这些行所做的任何更改。
[4] 仅由 SQLBulkOperations 返回。 不是由SQLFetch或SQLFetchScroll设置的。
提取的行缓冲区
"提取的行" 缓冲区用于返回提取的行数, 包括因为在提取数据时出错而未返回数据的行数。 换言之, 它是行状态数组中的值不是 SQL_ROW_NOROW 的行数。 此缓冲区的地址是用 SQL_ATTR_ROWS_FETCHED_PTR 语句特性指定的。 缓冲区由应用程序分配。 它由SQLFetch和SQLFetchScroll设置。 如果 SQL_ATTR_ROWS_FETCHED_PTR 语句特性的值为 null 指针, 则这些函数不返回提取的行数。 若要确定结果集中的当前行数, 应用程序可以使用 SQL_ATTR_ROW_NUMBER 属性调用SQLGetStmtAttr 。
如果SQLFetch或SQLFETCHSCROLL不返回 SQL_SUCCESS 或 SQL_SUCCESS_WITH_INFO (返回 SQL_NO_DATA 时除外), 则提取的行的内容将不确定, 在这种情况下, 提取缓冲区的行中的值将设置为0。
错误处理
错误和警告可应用于单个行或整个函数。 有关诊断记录的详细信息, 请参阅诊断和SQLGetDiagField。
针对整个函数的错误和警告
如果错误适用于整个函数 (如 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 设置为。
添加零个或多个包含 SQLSTATEs 错误或警告的状态记录。
设置状态记录中的行号和列号字段。 如果SQLFetch无法确定行号或列号, 则会将该数字分别设置为 SQL_ROW_NUMBER_UNKNOWN 或 SQL_COLUMN_NUMBER_UNKNOWN。 如果状态记录不适用于特定列, 则SQLFetch会将列号设置为 SQL_NO_COLUMN_NUMBER。
SQLFetch在提取行集中的所有行之前继续提取行。 它将返回 SQL_SUCCESS_WITH_INFO, 除非行集的每一行中发生错误 (不包括状态为 SQL_ROW_NOROW 的行), 在这种情况下, 它将返回 SQL_ERROR。 具体而言, 如果行集的大小为 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参数中传递的同一地址。 当应用程序调用SQLSetDescField或SQLSetDescRec时, 它可以将这两个字段设置为不同地址。
SQLFetch确定应用程序是否指定了单独的长度和指示器缓冲区。 在这种情况下, 当数据不为 NULL 时, SQLFetch会将指示器缓冲区设置为 0, 并返回长度缓冲区中的长度。 当数据为 NULL 时, SQLFetch会将指示器缓冲区设置为 SQL_NULL_DATA, 并且不会修改长度缓冲区。
代码示例
请参阅SQLBindCol、 SQLColumns、 SQLGetData和SQLProcedures。
相关函数
有关信息 | 请参阅 |
---|---|
将缓冲区绑定到结果集中的列 | SQLBindCol 函数 |
正在取消语句处理 | SQLCancel 函数 |
返回有关结果集中的列的信息 | SQLDescribeCol 函数 |
执行 SQL 语句 | SQLExecDirect 函数 |
执行已准备的 SQL 语句 | SQLExecute 函数 |
提取数据块或滚动结果集 | SQLFetchScroll 函数 |
在语句上关闭游标 | SQLFreeStmt 函数 |
提取部分或全部数据列 | SQLGetData 函数 |
返回结果集列的数目 | SQLNumResultCols 函数 |
准备要执行的语句 | SQLPrepare 函数 |
请参阅
*/
}
SQL Server SQLFetch()的更多相关文章
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- Sql Server系列:分区表操作
1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
随机推荐
- win10命令行kill进程
1. 查:netstat -ano | findstr "8080" 2. 杀:taskkill -PID 8082 -F
- .Net中Task使用来提高代码执行效率
技术不断更新迭代,更高效的执行效率越来越被重视,所以对Task的使用进行了简单使用做了整理与大家分享. .Net 中有了Task后使多线程编程更简单使用和操作,下面粘上代码进行简单说明: /// &l ...
- UIPageViewController看这篇就够了
先说初始化 - (UIPageViewController *)PageViewController{ if(!_PageViewController){ //书脊位置,只有在UIPageViewCo ...
- actionlib学习
ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息. action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度. 如navigat ...
- 机器学习Explainability vs Interpretability
The difference between machine learning explainability and interpretability In the context of machin ...
- node-fs(1) 无法从文件流内部读取到的字符串转化成json
先上一段代码 let fs=require('fs');//引入fs模块 let blob = fs.readFileSync('/node/product1/data.txt');//读取指定目录下 ...
- Python 分解质因数
def zys(n, value=[]): for i in range(2, int(n / 2 + 1)): if n % i == 0: value.append(i) zys(n / i, v ...
- 解析Spring第四天(Spring中的事物、Spring框架来管理模板类)
JDBC模板技术: Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 template 模板 都是Spring框架提供XxxTemplate 提供了JDBC模板,Sp ...
- delphi RichView的使用介绍
RichView 组件 由 9 个组件模块组成,分别是: 1.TRVStyle:主要是定义RICHVIEW样式,定义后,其它RIHCVIEW都可以引用此样式. 2.TRichView :主要用于显示 ...
- jQuery 事件 click() 方法,dblclick() 方法
click() 方法 当点击元素时,会发生 click 事件. 当鼠标指针停留在元素上方,然后按下并松开鼠标左键时,就会发生一次 click. click() 方法触发 click 事件,或规定当发生 ...