Delen via


IMultipleResults gebruiken om meerdere resultatensets te verwerken

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform Systeem (PDW)SQL-database in Microsoft Fabric

OLE DB-stuurprogramma downloaden

Consumenten gebruiken de IMultipleResults-interface om resultaten te verwerken die door de OLE DB Driver worden teruggegeven voor de uitvoering van SQL Server-commando's. Wanneer de OLE DB-driver voor SQL Server een commando voor uitvoering indient, voert SQL Server de statements uit en geeft eventuele resultaten terug.

Een client moet alle resultaten van de uitvoering van commando's verwerken. Omdat de OLE DB-driver voor SQL Server-commando-uitvoering als resultaat objecten met meerdere rijsets kan genereren, gebruik je de IMultipleResults-interface om ervoor te zorgen dat applicatiegegevensopvraging de door de client geïnitieerde rondreis voltooit.

De volgende Transact-SQL-instructie genereert meerdere rijsets, waarvan sommige rijgegevens uit de OrderDetails-tabel bevatten en sommige resultaten van de COMPUTE BY-clausule:

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  

Als een consument een commando uitvoert met deze tekst en een rijset aanvraagt als de geretourneerde resultaatinterface, wordt alleen de eerste set rijen teruggegeven. De consument kan alle rijen in de teruggegeven rijset verwerken. Maar als de eigenschap DBPROP_MULTIPLECONNECTIONS databron op VARIANT_FALSE staat en MARS niet is ingeschakeld op de verbinding, kunnen er geen andere commando's op het sessieobject worden uitgevoerd (de OLE DB Driver voor SQL Server maakt geen nieuwe verbinding aan) totdat het commando wordt geannuleerd. Als MARS niet is ingeschakeld op de verbinding, geeft de OLE DB-driver voor SQL Server een DB_E_OBJECTOPEN foutmelding als DBPROP_MULTIPLECONNECTIONS VARIANT_FALSE is en E_FAIL als er een actieve transactie is.

De OLE DB-driver voor SQL Server geeft ook DB_E_OBJECTOPEN terug wanneer gestreamde outputparameters worden gebruikt en de applicatie heeft niet alle teruggegeven outputparameters gebruikt voordat IMultipleResults::GetResults wordt aangeroepen om de volgende resultaatset te krijgen. Als MARS niet is ingeschakeld en de verbinding bezig is met het uitvoeren van een commando dat geen rijset produceert of een rijset produceert die geen servercursor is, en als de eigenschap DBPROP_MULTIPLECONNECTIONS databron is ingesteld op VARIANT_TRUE, maakt de OLE DB-driver voor SQL Server extra verbindingen om gelijktijdige commandoobjecten te ondersteunen, tenzij een transactie actief is, in welk geval een foutmelding wordt teruggegeven. Transacties en vergrendeling worden per verbinding beheerd door SQL Server. Als een tweede verbinding wordt gegenereerd, deelt het commando op de afzonderlijke verbindingen geen locks. Er moet voorzichtig worden geacht dat het ene commando het andere niet blokkeert door sloten vast te houden op de door het andere commando gevraagde rijen. Als MARS is ingeschakeld, kunnen meerdere commando's actief zijn op de verbindingen en als expliciete transacties worden gebruikt, delen alle commando's een gemeenschappelijke transactie.

De consument kan het commando annuleren door ISSAbort::Abort te gebruiken of door alle referenties op het commandoobject en de afgeleide rijset vrij te geven.

Door IMultipleResults in alle instanties te gebruiken, kan de consument alle rijsets die door commando-uitvoering worden gegenereerd ophalen en kan consumenten op passende wijze bepalen wanneer de commando-uitvoering geannuleerd moet worden en een sessieobject vrijgemaakt wordt voor gebruik door andere commando's.

Opmerking

Wanneer je SQL Server-cursors gebruikt, creëert command execution de cursor. SQL Server geeft succes of falen terug bij het aanmaken van de cursor; daarom is de retour naar de instantie van SQL Server voltooid zodra de commando-uitvoering terugkeert. Elke GetNextRows-oproep wordt dan een retour. Op deze manier kunnen meerdere actieve commando-objecten bestaan, elk met een rijset die het resultaat is van een fetch van de servercursor. Voor meer informatie, zie Rowsets en SQL Server Cursors.

Zie ook

Opdrachten