多个结果

结果是数据源在执行语句后返回的内容。 ODBC 有两种类型的结果:结果集和行计数。 行计数是受更新、删除或插入语句影响的行数量。 批处理(见SQL 语句批处理中所述)可以生成多个结果。

下表列出了应用程序用来确定数据源是否为每个不同类型的批处理返回多个结果的 SQLGetInfo 选项。 具体而言,数据源可以为整批语句返回单个行计数,也可以为批处理中的每个语句单独返回行计数。 对于使用参数数组执行的结果集生成语句,数据源可以为所有参数集返回单个结果集,或为每个参数集单独返回结果集。

批处理类型 行计数 结果集
显式批处理 SQL_BATCH_ROW_COUNT[a] --[b]
过程 SQL_BATCH_ROW_COUNT[a] --[b]
参数数组 SQL_PARAM_ARRAYS_ROW_COUNTS SQL_PARAM_ARRAYS_SELECTS

[a] 批处理中的行计数生成语句可能会受到支持,但不支持行计数的返回。 SQLGetInfo 中的 SQL_BATCH_SUPPORT 选项指示是否允许批量的行计数生成语句;SQL_BATCH_ROW_COUNTS 选项指示是否将这些行计数返回到应用程序。

[b] 显式批处理和过程在包含多个结果集生成语句时始终返回多个结果集。

注意

ODBC 1.0 中引入的 SQL_MULT_RESULT_SETS 选项仅提供有关是否可以返回多个结果集的一般信息。 具体而言,如果为 SQL_BATCH_SUPPORT 返回 SQL_BS_SELECT_EXPLICIT 或 SQL_BS_SELECT_PROC 位,或者为 SQL_PARAM_ARRAYS_SELECT 返回 SQL_PAS_BATCH,则设置为 "Y"。

要处理多个结果,应用程序将调用 SQLMoreResults。 此函数将放弃当前结果,并使下一个结果可用。 当没有更多可用结果时,它将返回 SQL_NO_DATA。 例如,假设以下语句作为批处理执行:

SELECT * FROM Parts WHERE Price > 100.00;  
UPDATE Parts SET Price = 0.9 * Price WHERE Price > 100.00  

执行这些语句后,应用程序将从 SELECT 语句创建的结果集中提取行。 提取行后,它会调用 SQLMoreResults,使重新定价的部分数可用。 如有必要,SQLMoreResults 放弃未提取的行并关闭游标。 然后,应用程序调用 SQLRowCount 来确定 UPDATE 语句重新定价了多少个部分。

在提供任何结果之前,是否执行整个批处理语句取决于驱动程序。 在某些实现中,情况确实如此;在另一些实现中,调用 SQLMoreResults 会触发批处理中的下一个语句的执行。

如果批处理中的某个语句失败,SQLMoreResults 将返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO。 如果批处理在语句失败或失败的语句是批处理中的最后一个语句时中止,则 SQLMoreResults 将返回 SQL_ERROR。 如果批处理在语句失败或失败的语句不是批处理中的最后一个语句时未中止,则 SQLMoreResults 将返回 SQL_SUCCESS_WITH_INFO。 SQL_SUCCESS_WITH_INFO 指示至少生成了一个结果集或计数,并且批处理未中止。