Wykorzystanie IMultipleResults do przetwarzania wielu zestawów wyników w natywnym kliencie SQL Server

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Konsumenci korzystają z interfejsu IMultipleResults do przetwarzania wyników zwracanych przez wykonanie poleceń dostawcy OLE DB na natywnym kliencie SQL Server. Gdy natywny dostawca bazy danych SQL Server Native Client OLE DB wyśle polecenie do wykonania, SQL Server wykonuje te instrukcje i zwraca wszystkie wyniki.

Klient musi przetwarzać wszystkie wyniki wykonania poleceń. Ponieważ wykonanie poleceń dostawcy OLE DB Native Client OLE DB SQL Server może generować obiekty z wieloma wierszami jako wyniki, wykorzystaj interfejs IMultipleResults, aby zapewnić, że pobieranie danych aplikacji zakończy cykl inicjowany przez klienta.

Poniższe polecenie Transact-SQL generuje wiele zestawów wierszy, niektóre zawierają dane wierszowe z tabeli OrderDetails , a inne wyniki klauzuli 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  

Jeśli konsument wykona polecenie zawierające ten tekst i zażąda zbioru wierszy jako interfejs zwróconych wyników, zwracany jest tylko pierwszy zestaw wierszy. Konsument może przetworzyć wszystkie wiersze w zwróconym zestawie wierszy. Jednak jeśli właściwość źródła danych DBPROP_MULTIPLECONNECTIONS jest ustawiona na VARIANT_FALSE, a MARS nie jest włączony na połączeniu, żadne inne polecenia nie mogą być wykonywane na obiekcie sesji (SQL Server provider Native Client OLE DB nie utworzy kolejnego połączenia), dopóki polecenie nie zostanie anulowane. Jeśli MARS nie jest włączony w połączeniu, SQL Server Native Client OLE DB dostawa błąd DB_E_OBJECTOPEN, jeśli DBPROP_MULTIPLECONNECTIONS jest VARIANT_FALSE i zwraca E_FAIL, jeśli transakcja jest aktywna.

Dostawca OLE DB SQL Server Native Client również zwraca DB_E_OBJECTOPEN przy użyciu parametrów wyjściowych streamowanych i aplikacja nie zużywa wszystkich zwróconych parametrów wyjściowych przed wywołaniem IMultipleResults::GetResults, aby uzyskać kolejny zestaw wyników. Jeśli MARS nie jest włączony, a połączenie jest zajęte wykonywaniem polecenia, które nie generuje wiersza lub które generuje zestaw wierszy niebędący kursorem serwera, a właściwość źródła danych DBPROP_MULTIPLECONNECTIONS jest ustawiona na VARIANT_TRUE, provider SQL Server Native Client OLE DB tworzy dodatkowe połączenia wspierające współbieżne obiekty poleceń, chyba że transakcja jest aktywna, wtedy zwraca błąd. Transakcje i blokowanie są zarządzane przez SQL Server na zasadzie pojedynczego połączenia. Jeśli zostanie wygenerowane drugie połączenie, polecenie na oddzielnych połączeniach nie udostępnia blokad. Należy uważać, aby jedno polecenie nie blokowało drugiego, przytrzymując blokady na wierszach żądanych przez drugie polecenie. Jeśli MARS jest włączony, na połączeniach może być aktywnych wiele poleceń, a jeśli używane są jawne transakcje, wszystkie polecenia dzielą wspólną transakcję.

Konsument może anulować polecenie, używając ISSAbort::Abort lub zwalniając wszystkie odwołania przechowywane na obiekcie polecenia i wyprowadzonym zestawie wierszy.

Wykorzystanie IMultipleResults we wszystkich instancjach pozwala konsumentowi uzyskać wszystkie wiersze generowane przez wykonanie poleceń oraz odpowiednio określić, kiedy anulować wykonanie poleceń i zwolnić obiekt sesji do użycia przez inne polecenia.

Note

Gdy używasz kursorów SQL Server, wykonywanie poleceń tworzy kursor. SQL Server zwraca sukces lub porażkę przy tworzeniu kursora; dlatego podróż w obie strony do instancji SQL Server jest zakończona po powrocie z wykonania poleceń. Każde połączenie GetNextRows staje się wtedy kursem w obie strony. W ten sposób może istnieć wiele aktywnych obiektów poleceń, z których każdy przetwarza zestaw wierszy będący wynikiem pobierania z kursora serwera. Więcej informacji można znaleźć w artykule Rowsety i kursory SQL Server.