Uso di IMultipleResults per elaborare più set di risultati in SQL Server Native Client
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
I consumer usano l'interfaccia IMultipleResults per elaborare i risultati restituiti dall'esecuzione dei comandi del provider OLE DB di SQL Server Native Client. Quando il provider OLE DB di SQL Server Native Client invia un comando per l'esecuzione, SQL Server esegue le istruzioni e restituisce i risultati.
Tutti i risultati ottenuti dall'esecuzione dei comandi devono essere elaborati da un client. Poiché l'esecuzione del comando del provider OLE DB di SQL Server Native Client può generare oggetti set di righe multipli come risultati, usare l'interfaccia IMultipleResults per garantire che il recupero dei dati dell'applicazione completi il round trip avviato dal client.
L'istruzione Transact-SQL seguente genera più set di righe, alcuni dei quali contengono dati di riga della tabella OrderDetails, mentre altri contengono i risultati della clausola 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
Se un consumer esegue un comando contenente questo testo e richiede un set di righe come interfaccia dei risultati restituiti, viene restituito solo il primo set di righe. Il consumer può elaborare tutte le righe del set di righe restituito. Tuttavia, se la proprietà dell'origine dati DBPROP_MULTIPLECONNECTIONS è impostata su VARIANT_FALSE e MARS non è abilitato nella connessione, non è possibile eseguire altri comandi nell'oggetto sessione (il provider OLE DB di SQL Server Native Client non creerà un'altra connessione) finché il comando non viene annullato. Se MARS non è abilitato nella connessione, il provider OLE DB di SQL Server Native Client restituisce un errore di DB_E_OBJECTOPEN se DBPROP_MULTIPLECONNECTIONS è VARIANT_FALSE e restituisce E_FAIL se è presente una transazione attiva.
Il provider OLE DB di SQL Server Native Client restituirà anche DB_E_OBJECTOPEN quando si usano parametri di output trasmessi e l'applicazione non ha utilizzato tutti i valori dei parametri di output restituiti prima di chiamare IMultipleResults::GetResults per ottenere il set di risultati successivo. Se MARS non è abilitato e la connessione è occupata nell'esecuzione di un comando che non produce un set di righe o che produce un set di righe che non è un cursore del server e se la proprietà dell'origine dati DBPROP_MULTIPLECONNECTIONS è impostata su VARIANT_TRUE, il provider OLE DB di SQL Server Native Client crea connessioni aggiuntive per supportare oggetti comando simultanei, a meno che una transazione non sia attiva, nel qual caso restituisce un errore. Le transazioni e il blocco vengono gestiti da SQL Server per singola connessione. Se viene generata una seconda connessione, il comando sulle connessioni separate non condivide i blocchi. È necessario assicurarsi che un comando non blocchi un altro comando mantenendo attivi i blocchi sulle righe richieste da quest'ultimo. Se MARS è abilitato, è possibile disporre di più comandi attivi sulle connessioni e se vengono utilizzate transazioni esplicite tutti i comandi condividono una transazione comune.
Il consumer può annullare il comando usando ISSAbort::Abort oppure rilasciando tutti i riferimenti mantenuti sull'oggetto comando e sul set di righe derivato.
Se IMultipleResults viene usato in tutte le istanze, il consumer può ottenere tutti i set di righe generati dall'esecuzione dei comandi e determinare in modo appropriato il momento in cui annullare l'esecuzione dei comandi e liberare un oggetto sessione per consentirne l'uso da parte di altri comandi.
Nota
Quando si usano cursori SQL Server, l'esecuzione di comandi crea il cursore. SQL Server restituisce l'esito positivo o negativo della creazione del cursore. Pertanto, il round trip all'istanza di SQL Server viene completato al momento della restituzione da parte dell'esecuzione di comandi. Ogni chiamata a GetNextRows diventa quindi un round trip. In questo modo, possono esistere più oggetti comando attivi, ognuno dei quali elabora un set di righe che rappresenta il risultato di un recupero dal cursore del server. Per altre informazioni, vedere Set di righe e cursori SQL Server.