Freigeben über


Verwenden von 'IMultipleResults' zur Verarbeitung mehrerer Resultsets

Consumer verwenden die IMultipleResults-Schnittstelle, um Ergebnisse zu verarbeiten, die von einer Befehlsausführung des SQL Server Native Client OLE DB-Anbieters zurückgegeben wurden. Wenn der SQL Server Native Client OLE DB-Anbieter einen Befehl zur Ausführung übergibt, führt SQL Server die Anweisungen aus und gibt Ergebnisse zurück.

Ein Client muss alle Ergebnisse der Befehlsausführung verarbeiten. Da die Befehlsausführung des SQL Server Native Client OLE DB-Anbieters mehrere Rowsetobjekte als Ergebnis generieren kann, verwenden Sie die IMultipleResults-Schnittstelle, um sicherzustellen, dass das Abrufen der Anwendungsdaten den vom Client initiierten Roundtrip vollständig durchläuft.

Die folgende Transact-SQL-Anweisung generiert mehrere Rowsets, von denen einige Zeilendaten aus der OrderDetails-Tabelle und einige Ergebnisse der COMPUTE BY-Klausel enthalten:

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

Wenn ein Consumer einen Befehl ausführt, der diesen Text enthält, und ein Rowset als Schnittstelle für die zurückgegebenen Ergebnisse anfordert, wird nur der erste Satz Zeilen zurückgegeben. Der Consumer kann alle Zeilen im zurückgegebenen Rowset verarbeiten. Wenn jedoch die DBPROP_MULTIPLECONNECTIONS-Datenquelleneigenschaft auf VARIANT_FALSE festgelegt ist und MARS nicht für die Verbindung aktiviert ist, können keine anderen Befehle für das Sitzungsobjekt ausgeführt werden (der SQL Server Native Client OLE DB-Anbieter stellt keine weitere Verbindung her), bis der Befehl abgebrochen wird. Wenn MARS nicht für die Verbindung aktiviert ist, gibt der SQL Server Native Client OLE DB-Anbieter den DB_E_OBJECTOPEN-Fehler zurück, wenn DBPROP_MULTIPLECONNECTIONS auf VARIANT_FALSE lautet, und E_FAIL, wenn es eine aktive Transaktion gibt.

Der OLE DB-Anbieter SQL Server Native Client gibt auch dann DB_E_OBJECTOPEN zurück, wenn er einen Ausgabeparameter-Datenstrom verwendet und die Anwendung nicht alle zurückgegebenen Ausgabeparameterwerte verarbeitet hat, bevor das nächste Resultset mit IMultipleResults::GetResults abgerufen wird. Wenn MARS nicht aktiviert und die Verbindung mit der Ausführung eines Befehls ausgelastet ist, der kein Rowset oder ein Rowset, der kein Servercursor ist, generiert, und die DBPROP_MULTIPLECONNECTIONS-Datenquelleneigenschaft auf VARIANT_TRUE festgelegt ist, stellt der OLE DB-Anbieter von SQL Server Native Client zusätzliche Verbindungen her, um gleichzeitige Befehlsobjekte zu unterstützen, sofern keine Transaktion aktiv ist. Im letzteren Fall würde er einen Fehler zurückgeben. Transaktionen und Sperren werden von SQL Server auf Verbindungsbasis verwaltet. Wenn eine zweite Verbindung hergestellt wird, nutzt der Befehl auf den anderen Verbindungen Sperren nicht gemeinsam. Es muss darauf geachtet werden, dass ein Befehl einen anderen nicht blockiert, indem er Zeilen gesperrt hält, die von einem anderen Befehl angefordert werden. Wenn MARS aktiviert ist, können mehrere Befehle für die Verbindungen aktiv sein, und bei der Verwendung expliziter Transaktionen nutzen die Befehle alle eine gemeinsame Transaktion.

Der Consumer kann den Befehl abbrechen, indem er ISSAbort::Abort verwendet oder alle Verweise auf das Befehlsobjekt und das abgeleitete Rowset freigibt.

Die Verwendung von IMultipleResults in allen Instanzen ermöglicht es, alle Rowsets durch Befehlsausführung zu erstellen, und gestattet es Consumern zu ermitteln, wann die Befehlsausführung abgebrochen und ein Sitzungsobjekt zur Verwendung durch andere Befehle freigegeben werden sollte.

HinweisHinweis

Wenn Sie SQL Server-Cursor verwenden, erstellt die Befehlsausführung den Cursor. SQL Server gibt den Erfolg oder Fehler der Cursorerstellung zurück. Der Roundtrip zur Instanz von SQL Server ist damit nach der Rückkehr der Befehlsausführung abgeschlossen. Jeder GetNextRows-Aufruf wird dann zum Roundtrip. Auf diese Weise können mehrere Befehlsobjekte vorhanden sein, und jedes verarbeitet ein Rowset, das das Ergebnis eines Abrufs vom Servercursor ist. Weitere Informationen finden Sie unter Rowsets und SQL Server-Cursor.

Siehe auch

Konzepte

Befehle