执行语句后,结果 是数据源返回的内容。 ODBC 有两种类型的结果:结果集和行计数。 行计数 是受更新、删除或 insert 语句影响的行数。 批处理(SQL 语句批处理中所述)可以生成多个结果。
下表列出了应用程序用来确定数据源是否为每个不同类型的批处理返回多个结果的 SQLGetInfo 选项。 具体而言,数据源可以为批处理中每个语句返回单个行计数,也可以为批处理中的每个语句返回单个行计数。 对于执行带有参数数组的结果集生成语句,数据源可以为所有参数集返回一个统一的结果集,或者为每个参数集分别返回单独的结果集。
| 批处理类型 | 行计数 | 结果集 |
|---|---|---|
| 显式批处理 | SQL_BATCH_ROW_COUNT[a] | --[b] |
| Procedure | SQL_BATCH_ROW_COUNT[a] | --[b] |
| 参数数组 | SQL_PARAM_ARRAYS_ROW_COUNTS(SQL参数数组行计数) | 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指示至少生成了一个结果集或计数,并且批处理未中止。