Verwenden von IMultipleResults zum Verarbeiten mehrerer Resultsets in SQL Server Native Client
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Consumer verwenden die IMultipleResults-Schnittstelle , um Ergebnisse zu verarbeiten, die von sql Server Native Client OLE DB-Anbieterbefehlsausführung zurückgegeben werden. Wenn der OLE DB-Anbieter von SQL Server Native Client einen Befehl zur Ausführung sendet, führt SQL Server die Anweisungen aus und gibt alle Ergebnisse zurück.
Ein Client muss alle Ergebnisse der Befehlsausführung verarbeiten. Da die Sql Server Native Client OLE DB-Anbieterbefehlsausführung mehrere Rowset-Objekte als Ergebnisse generieren kann, verwenden Sie die IMultipleResults-Schnittstelle , um sicherzustellen, dass der Abruf von Anwendungsdaten den vom Client initiierten Roundtrip abschließt.
Die folgende Transact-SQL-Anweisung generiert mehrere Rowsets, von denen einige Zeilendaten aus der Tabelle OrderDetails 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 die DBPROP_MULTIPLECONNECTIONS-Datenquelleneigenschaft jedoch auf VARIANT_FALSE festgelegt ist und MARS für die Verbindung nicht aktiviert ist, können keine anderen Befehle für das Sitzungsobjekt ausgeführt werden (der OLE DB-Anbieter von SQL Server Native Client erstellt keine weitere Verbindung), bis der Befehl abgebrochen wird. Wenn MARS für die Verbindung nicht aktiviert ist, gibt der OLE DB-Anbieter des SQL Server Native Client einen DB_E_OBJECTOPEN Fehler zurück, wenn DBPROP_MULTIPLECONNECTIONS VARIANT_FALSE ist und E_FAIL zurückgibt, wenn eine aktive Transaktion vorhanden ist.
Der OLE DB-Anbieter von SQL Server Native Client gibt auch DB_E_OBJECTOPEN zurück, wenn streamte Ausgabeparameter verwendet werden, und die Anwendung hat nicht alle zurückgegebenen Ausgabeparameterwerte verbraucht, bevor IMultipleResults::GetResults aufgerufen wird, um das nächste Resultset abzurufen. Wenn MARS nicht aktiviert ist und die Verbindung mit dem Ausführen eines Befehls beschäftigt ist, der kein Rowset erzeugt oder ein Rowset erzeugt, das kein Servercursor ist, und wenn die DBPROP_MULTIPLECONNECTIONS-Datenquelleneigenschaft auf VARIANT_TRUE festgelegt ist, erstellt der OLE DB-Anbieter von SQL Server Native Client zusätzliche Verbindungen zur Unterstützung gleichzeitiger Befehlsobjekte, es sei denn, eine Transaktion ist aktiv, in diesem Fall 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.
Hinweis
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 Aufruf von GetNextRows 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.