共用方式為


使用 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,如果DBPROP_MULTIPLECONNECTIONS為VARIANT_FALSE,則 SQL Server Native Client OLE DB 提供者會傳回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 數據指標

另請參閱

命令