使用 IMultipleResults 來處理多個結果集
取用者會使用IMultipleResults介面來處理 SQL Server Native Client OLE DB 提供者命令執行所傳回的結果。 當 SQL Server Native Client OLE DB 提供者提交命令以供執行時,SQL Server執行 語句並傳回任何結果。
用戶端必須處理命令執行所產生的所有結果。 由於SQL Server Native Client OLE DB 提供者命令執行可能會產生多個資料列集物件作為結果,因此請使用IMultipleResults介面來確保應用程式資料擷取會完成用戶端起始的來回行程。
下列 Transact-SQL 陳述式會產生多個資料列集,其中有些包含來自 OrderDetails 資料表的資料列資料,有些包含 COMPUTE BY 子句的結果:
SELECT OrderID, FullPrice = (UnitPrice * Quantity), Discount,
Discounted = UnitPrice * (1 - Discount) * Quantity
FROM OrderDetails
ORDER BY OrderID
COMPUTE
SUM(UnitPrice * Quantity), SUM(UnitPrice * (1 - Discount) * Quantity)
BY OrderID
如果取用者執行包含此文字的命令,並要求資料列集做為傳回的結果介面,則只會傳回第一組資料列。 取用者可能會處理傳回之資料列集中的所有資料列。 但是,如果DBPROP_MULTIPLECONNECTIONS資料來源屬性設定為 VARIANT_FALSE,且未在連線上啟用 MARS,則 (在取消命令之前,SQL Server Native Client OLE DB 提供者將不會建立另一個連線) ,否則無法在會話物件上執行任何其他命令。 如果未在連線上啟用 MARS,SQL Server Native Client OLE DB 提供者會在VARIANT_FALSE DBPROP_MULTIPLECONNECTIONS傳回DB_E_OBJECTOPEN錯誤,並在有使用中交易時傳回E_FAIL。
使用串流輸出參數時,SQL Server Native Client OLE DB 提供者也會傳回DB_E_OBJECTOPEN,而且應用程式在呼叫IMultipleResults::GetResults之前,尚未取用所有傳回的輸出參數值,以取得下一個結果集。 如果未啟用 MARS,且連線忙碌中執行不會產生資料列集的命令,或產生不是伺服器資料指標的資料列集,而且如果DBPROP_MULTIPLECONNECTIONS資料來源屬性設定為 VARIANT_TRUE,則 SQL Server Native Client OLE DB 提供者會建立其他連線以支援並行命令物件,除非交易為使用中, 在此情況下,它會傳回錯誤。 交易與鎖定會依連線由 SQL Server 管理。 如果產生另一個連接,個別連接上的命令不會共用鎖定。 請務必藉由保留另一個命令要求之資料列上的鎖定來確保命令之間不會互相封鎖。 如果有啟用 MARS,在連接上可以有多個命令處於作用中狀態,而如果有使用明確交易,則所有命令都會共用一個公用交易。
取用者可以使用 ISSAbort::Abort,或釋放保留在命令物件和衍生之資料列集上的所有參考,藉以取消命令。
在所有執行個體中使用 IMultipleResults 可讓取用者取得命令執行所產生的所有資料列集,並讓取用者以適當的方式決定何時取消命令執行,以及釋放工作階段物件供其他命令使用。
注意
當您使用 SQL Server 資料指標時,命令執行會建立資料指標。 SQL Server 會傳回資料指標建立成功或失敗,因此,在從命令執行傳回時,會完成 SQL Server 執行個體的往返。 接著,每個 GetNextRows 呼叫都會變成往返。 以此種方式,系統可以存在多個作用中的命令物件,而且每個都處理一個屬於伺服器資料指標之提取結果的資料列集。 如需詳細資訊,請參閱資料列集和 SQL Server 資料指標。