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 von SQL Server Native Client gibt auch dann DB_E_OBJECTOPEN zurück, wenn ein Ausgabeparameterstream verwendet wird und die Anwendung nicht alle zurückgegebenen Ausgabeparameterwerte verarbeitet hat, bevor IMultipleResults::GetResults zum Abrufen des nächsten Resultsets aufgerufen wird. Wenn MARS nicht aktiviert ist und die Verbindung gerade einen Befehl ausführt, der kein Rowset erzeugt bzw. ein Rowset, das kein Servercursor ist, und wenn die Datenquelleneigenschaft DBPROP_MULTIPLECONNECTIONS auf den Wert VARIANT_TRUE festgelegt ist, erstellt der OLE DB-Anbieter von SQL Server Native Client zusätzliche Verbindungen, um mehrere Befehlsobjekte gleichzeitig verarbeiten zu können, sofern keine Transaktion aktiv ist. Bei einer aktiven Transaktion wird ein Fehler zurückgegeben. 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 zurück, ob die Cursorerstellung erfolgreich war oder fehlgeschlagen ist. Daher ist der Roundtrip zur Instanz von SQL Server bei Rückgabe durch die 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