Condividi tramite


Uso di IMultipleResults per elaborare più set di risultati

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.

Un client deve elaborare tutti i risultati dall'esecuzione del comando. 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 contenenti dati di riga della tabella OrderDetails e alcuni contenenti 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 nel 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 ogni connessione. Se viene generata una seconda connessione, il comando sulle connessioni separate non condivide i blocchi. È necessario prestare attenzione per assicurarsi che un comando non blocchi un altro mantenendo blocchi sulle righe richieste dall'altro comando. Se MARS è abilitato, è possibile attivare più comandi nelle connessioni e, se vengono usate transazioni esplicite, i comandi condividono tutte una transazione comune.

Il consumer può annullare il comando usando ISSAbort::Abort o rilasciando tutti i riferimenti contenuti nell'oggetto comando e nel set di righe derivato.

L'uso di IMultipleResults in tutte le istanze consente al consumer di ottenere tutti i set di righe generati dall'esecuzione del comando e consente ai consumer di determinare in modo appropriato quando annullare l'esecuzione del comando e liberare un oggetto sessione da usare da altri comandi.

Annotazioni

Quando si usano i cursori di SQL Server, l'esecuzione dei comandi crea il cursore. SQL Server restituisce esito positivo o negativo durante la creazione del cursore; pertanto, il round trip all'istanza di SQL Server viene completato al ritorno dall'esecuzione del comando. Ogni chiamata GetNextRows diventa quindi un round trip. In questo modo, possono esistere più oggetti comando attivi, ognuno dei quali elabora un set di righe che è il risultato di un recupero dal cursore del server. Per altre informazioni, vedere Set di righe e cursori SQL Server.

Vedere anche

Comandi