一致性
引入的版本:ODBC 1.0 标准符合性:ODBC
总结
SQLMoreResults 确定在包含 SELECT、 UPDATE、 INSERT 或 DELETE 语句的语句上是否提供了更多结果,如果是,则初始化这些结果的处理。
语法
SQLRETURN SQLMoreResults(
SQLHSTMT StatementHandle);
论据
StatementHandle
[输入]语句句柄。
退货
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_NO_DATA、SQL_ERROR、SQL_INVALID_HANDLE或SQL_PARAM_DATA_AVAILABLE。
诊断
当 SQLMoreResults 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过使用 handleType of SQL_HANDLE_STMT 和 StatementHandle句柄调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值。 下表列出了 SQLMoreResults 通常返回的 SQLSTATE 值,并解释此函数上下文中的每个值:表示法“(DM)”位于驱动程序管理器返回的 SQLSTATE 的说明之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。
SQLSTATE | 错误 | DESCRIPTION |
---|---|---|
01000 | 常规警告 | 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。) |
01S02 | 选项值已更改 | 在处理批处理时,语句属性的值已更改。 (函数返回SQL_SUCCESS_WITH_INFO。) |
08S01 | 通信链接失败 | 驱动程序与驱动程序连接到的数据源之间的通信链接在函数完成处理之前失败。 |
40001 | 序列化失败 | 由于资源死锁与另一个事务,事务已回滚。 |
40003 | 语句完成未知 | 执行此函数期间关联的连接失败,无法确定事务的状态。 |
HY000 | 常规错误 | 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。 |
HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成函数所需的内存。 |
HY008 | 操作已取消 | 为 StatementHandle启用了异步处理。 调用了 SQLMoreResults 函数,在完成执行之前,对 StatementHandle 调用 SQLCancel 或SQLCancelHandle。 然后,对 StatementHandle 再次调用 SQLMoreResults 函数。 调用了 SQLMoreResults 函数,在完成执行之前,SQLCancel 或 SQLCancelHandle 在多线程应用程序中的不同线程上调用了 StatementHandle。 |
HY010 | 函数序列错误 | (DM) 为与 StatementHandle关联的连接句柄调用异步执行函数。 调用 SQLMoreResults 函数时,此异步函数仍在执行。 (DM) 为 StatementHandle 调用异步执行函数(而不是此函数),并在调用此函数时仍在执行。 (DM) SQLExecute、SQLExecDirect、SQLBulkOperations或 SQLSetPos 为 StatementHandle 调用并返回SQL_NEED_DATA。 在为所有数据执行参数或列发送数据之前调用此函数。 |
HY013 | 内存管理错误 | 无法处理函数调用,因为基础内存对象无法访问,可能是因为内存条件低。 |
HY117 | 连接因未知事务状态而挂起。 仅允许断开连接和只读函数。 | (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数。 |
HYT01 | 超过连接超时时间 | 在数据源响应请求之前,连接超时期限已过期。 连接超时期限是通过 sqlSetConnectAttr |
IM001 | 驱动程序不支持此函数 | (DM) 与 StatementHandle 关联的驱动程序不支持该函数。 |
IM017 | 在异步通知模式下禁用轮询 | 每当使用通知模型时,轮询将被禁用。 |
IM018 | SQLCompleteAsync 尚未调用以完成此句柄上的上一个异步操作。 | 如果句柄上的上一个函数调用返回SQL_STILL_EXECUTING并且启用通知模式 ,则必须在句柄上调用 SQLCompleteAsync 才能执行后期处理并完成操作。 |
注释
SELECT 语句返回结果集。 UPDATE、 INSERT 和 DELETE 语句返回受影响的行计数。 如果这些语句中的任何一个是批处理的,则使用参数数组(按递增参数顺序进行编号,按照它们在批处理中出现的顺序)或过程中,可以返回多个结果集或行计数。 有关语句和参数数组的批处理的信息,请参阅 SQL 语句的批处理 和 参数值的数组。
执行批处理后,应用程序将定位在第一个结果集上。 应用程序可以在第一个或任何后续结果集上调用 SQLBindCol、 SQLBulkOperations、 SQLFetch、 SQLGetData、 SQLFetchScroll、 SQLSetPos 和所有元数据函数,就像只有单个结果集一样。 完成第一个结果集后,应用程序会调用 SQLMoreResults 以移动到下一个结果集。 如果另一个结果集或计数可用, SQLMoreResults 将返回SQL_SUCCESS并初始化结果集或计数以供其他处理。 如果结果集生成语句之间出现任何行计数生成语句,则可以通过调用 SQLMoreResults 来逐行生成语句。为 UPDATE、INSERT 或 DELETE 语句调用 SQLMoreResults 后,应用程序可以调用 SQLRowCount。
如果有具有未提取行的当前结果集, SQLMoreResults 将放弃该结果集,并使下一个结果集或计数可用。 如果处理了所有结果, SQLMoreResults 将返回SQL_NO_DATA。 对于某些驱动程序,在处理所有结果集和行计数之前,输出参数和返回值不可用。 对于此类驱动程序, 当 SQLMoreResults 返回SQL_NO_DATA时,输出参数和返回值将变为可用。
为上一个结果集建立的任何绑定仍然有效。 如果此结果集的列结构不同,则调用 SQLFetch 或 SQLFetchScroll 可能会导致错误或截断。 为防止这种情况,应用程序必须调用 SQLBindCol 以根据需要显式重新绑定(或者通过设置描述符字段执行此作)。 或者,应用程序可以使用SQL_UNBIND选项调用 SQLFreeStmt 来取消绑定所有列缓冲区。
当应用程序通过调用 SQLMoreResults 浏览批处理时,语句特性的值(如游标类型、游标并发、键集大小或最大长度)可能会更改。 如果发生这种情况, SQLMoreResults 将返回SQL_SUCCESS_WITH_INFO和 SQLSTATE 01S02(选项值已更改)。
使用选项SQL_CLOSE调用 SQLCloseCursor 或 SQLFreeStmt 会放弃批处理执行后提供的所有结果集和行计数。 语句句柄返回已分配状态或已准备状态。 调用 SQLCancel 以在执行批处理时取消异步执行函数,并且语句句柄处于执行状态、游标定位状态或异步状态时,如果取消调用成功,则放弃批处理生成的所有结果集和行计数。 然后,该语句将返回到已准备或分配的状态。
如果一批语句或过程将其他 SQL 语句与 SELECT、 UPDATE、 INSERT 和 DELETE 语句混合,则这些其他语句不会影响 SQLMoreResults。
有关详细信息,请参阅 “多个结果”。
如果一批语句中搜索的更新、插入或删除语句不会影响数据源中的任何行, SQLMoreResults 将返回SQL_SUCCESS。 这与通过 SQLExecDirect、SQLExecute 或 SQLParamData 执行的搜索更新、插入或删除语句的情况不同,如果它不会影响数据源中的任何行,则返回SQL_NO_DATA。 如果应用程序调用 SQLRowCount 以在调用 SQLMoreResults 后检索行计数不会影响任何行, 则 SQLRowCount 将返回SQL_NO_DATA。
有关结果处理函数的有效排序的其他信息,请参阅 附录 B:ODBC 状态转换表。
有关SQL_PARAM_DATA_AVAILABLE和流式传输输出参数的详细信息,请参阅 使用 SQLGetData 检索输出参数。
行计数的可用性
当批处理包含多个连续行计数生成语句时,可能会将这些行计数汇总到一个行计数中。 例如,如果批处理有五个 insert 语句,则某些数据源能够返回五个单独的行计数。 某些其他数据源仅返回一个行计数,表示五个单独行计数的总和。
当批处理包含结果集生成和行计数生成语句的组合时,行计数可能根本不可用。 驱动程序与行计数可用性相关的行为在通过调用 SQLGetInfo 提供的SQL_BATCH_ROW_COUNT信息类型中枚举。 例如,假设批处理包含 SELECT,后跟两个 INSERT 语句和另一个 SELECT。 然后,可以采用以下情况:
与两个 INSERT 语句对应的行计数根本不可用。 对 SQLMoreResults 的第一次调用会将你定位在第二个 SELECT 语句的结果集上。
对应于两个 INSERT 语句的行计数单独可用。 (对 SQLGetInfo 的调用不返回SQL_BATCH_ROW_COUNT信息类型的SQL_BRC_ROLLED_UP位。对 SQLMoreResults 的第一次调用将定位在第一个 INSERT 的行计数上,第二次调用会将你定位在第二个 INSERT 的行计数上。 对 SQLMoreResults 的第三次调用会将你定位到第二个 SELECT 语句的结果集上。
对应于两个 INSERT 的行计数汇总为一个可用的单行计数。 (对 SQLGetInfo 的调用返回SQL_BATCH_ROW_COUNT信息类型的SQL_BRC_ROLLED_UP位。对 SQLMoreResults 的第一次调用会将你定位在汇总行计数上,对 SQLMoreResults 的第二次调用会将你定位在第二个 SELECT 的结果集上。
某些驱动程序使行计数仅适用于显式批处理,而不适用于存储过程。
相关函数
有关 | 请参阅 |
---|---|
取消语句处理 | SQLCancel 函数 |
提取数据块或滚动结果集 | SQLFetchScroll 函数 |
提取单行或仅向前方向的数据块 | SQLFetch 函数 |
提取部分或全部数据列 | SQLGetData 函数 |