Sdílet prostřednictvím


Použití IMultipleResults ke zpracování více sad výsledků

Platí na:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytický platformový systém (PDW)SQL databáze v Microsoft Fabric

Stáhnout ovladač OLE DB

Spotřebitelé používají rozhraní IMultipleResults ke zpracování výsledků vrácených ovladačem OLE DB pro provádění příkazů SQL Server. Když ovladač OLE DB pro SQL Server odešle příkaz k vykonání, SQL Server spustí příkazy a vrátí všechny výsledky.

Klient musí zpracovat všechny výsledky z provádění příkazů. Protože ovladač OLE DB pro SQL Server může generovat objekty s více řádky jako výsledky, použijte rozhraní IMultipleResults k zajištění, že načítání dat aplikací dokončí klientem iniciovanou cestu tam a zpět.

Následující příkaz Transact-SQL generuje více řádků, některé obsahují řádková data z tabulky OrderDetails a jiné výsledky klauzule 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  

Pokud uživatel vykoná příkaz obsahující tento text a požádá o řádkovou sadu jako rozhraní pro vrácené výsledky, vrátí se pouze první sada řádků. Spotřebitel může zpracovat všechny řádky v vrácené sadě řádků. Pokud je však vlastnost zdroje dat DBPROP_MULTIPLECONNECTIONS nastavena na VARIANT_FALSE a MARS není na spojení povolen, nelze na objektu relace spustit žádné další příkazy (OLE DB Driver pro SQL Server nevytváří další připojení), dokud není příkaz zrušen. Pokud není MARS na spojení povolen, ovladač OLE DB pro SQL Server vrátí chybu DB_E_OBJECTOPEN, pokud je DBPROP_MULTIPLECONNECTIONS VARIANT_FALSE, a vrátí E_FAIL, pokud je transakce aktivní.

Ovladač OLE DB pro SQL Server také vrátí DB_E_OBJECTOPEN při použití parametrů streamovaného výstupu a aplikace před vyvoláním IMultipleResults::GetResults nepoužila všechny vrácené hodnoty parametrů před vyvoláním IMultipleResults::GetResults pro získání další sady výsledků. Pokud není MARS povolen a spojení je zaneprázdněno spuštěním příkazu, který nevytváří sadu řádků nebo který vytváří sadu řádků, která není kurzorem serveru, a pokud je vlastnost zdroj dat DBPROP_MULTIPLECONNECTIONS nastavena na VARIANT_TRUE, OLE DB Driver pro SQL Server vytváří další spojení pro podporu současných příkazových objektů, pokud transakce není aktivní, v takovém případě vrací chybu. Transakce a zamykání jsou spravovány SQL Serverem na základě jednotlivých připojení. Pokud je vygenerováno druhé spojení, příkaz na samostatná připojení nesdílí zámky. Je třeba dbát na to, aby jeden příkaz neblokoval jiný držením zámků na řadách požadovaných druhým příkazem. Pokud je MARS povolen, může být na spojení aktivováno více příkazů a pokud se používají explicitní transakce, všechny příkazy sdílejí jednu transakci.

Uživatel může příkaz zrušit buď použitím ISSAbort::Abort, nebo uvolněním všech odkazů uložených na příkazovém objektu a odvozené sadě řádků.

Použití IMultipleResults ve všech instancích umožňuje uživateli získat všechny řádky generované vykonáním příkazů a správně určit, kdy zrušit provádění příkazu, a uvolnit objekt relace pro použití jinými příkazy.

Poznámka:

Když použijete kurzor SQL Serveru, vykonání příkazu kurzor vytvoří. SQL Server vrací úspěch nebo neúspěch při tvorbě kurzoru; tím pádem je okružní cesta k instanci SQL Serveru dokončena po návratu z příkazu. Každý hovor GetNextRows se pak stává okružní jízdou. Tímto způsobem může existovat více aktivních příkazových objektů, z nichž každý zpracovává sadu řádků vzniklou načtení ze serverového kurzora. Pro více informací viz Řádky a kurzory SQL Serveru.

Viz také

Příkazy