多個結果

結果是在陳述式執行後由資料來源傳回的資料。 ODBC 有兩種類型的結果:結果集和資料列計數。 資料列計數是受到 update、delete 或 insert 陳述式影響的資料列計數。 批次,如 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 指出至少產生一個結果集或計數,且批次未中止。