Utilizzo dell'interfaccia IMultipleResults per elaborare più set di risultati
I consumer utilizzano 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 tutti i risultati.
Tutti i risultati ottenuti dall'esecuzione dei comandi devono essere elaborati da un client. Dal momento che l'esecuzione dei comandi del provider OLE DB di SQL Server Native Client può generare come risultato oggetti con più set di righe, utilizzare l'interfaccia IMultipleResults per assicurare che il recupero dei dati dell'applicazione completi il round trip iniziato dal client.
L'istruzione Transact-SQL seguente genera più set di righe, alcuni dei quali contengono dati di riga dalla 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 sulla connessione non è abilitato il servizio MARS, sull'oggetto sessione non è possibile eseguire nessun altro comando (il provider OLE DB di SQL Server Native Client non creerà un'altra connessione) fino a quando il comando non verrà annullato. Se sulla connessione non è abilitato il servizio MARS, il provider OLE DB di SQL Server Native Client restituisce un errore DB_E_OBJECTOPEN nel caso in cui DBPROP_MULTIPLECONNECTIONS sia impostato su VARIANT_FALSE e restituisce E_FAIL nel caso in cui sia presente una transazione attiva.
Il provider OLE DB di SQL Server Native Client restituirà inoltre DB_E_OBJECTOPEN in caso di utilizzo dei parametri di output trasmessi e nel caso in cui l'applicazione non abbia utilizzato tutti i valori del parametro di output restituiti prima di chiamare IMultipleResults::GetResults per ottenere il set di risultati successivo. Se MARS non è abilitato e la connessione è occupata ad eseguire un comando che non produce un set di righe o che produce un set di righe che non è un cursore server e se la proprietà di 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 non sia attiva una transazione, 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 utilizzando ISSAbort::Abort oppure rilasciando tutti i riferimenti mantenuti sull'oggetto comando e sul set di righe derivato.
Se IMultipleResults viene utilizzato 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'utilizzo da parte di altri comandi.
[!NOTA]
Quando si utilizzano 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 ulteriori informazioni, vedere Set di righe e cursori SQL Server.