Partager via


Utilisation d'IMultipleResults pour traiter plusieurs jeux de résultats

Les consommateurs utilisent l’interface IMultipleResults pour traiter les résultats retournés par SQL Server Native Client’exécution de commande du fournisseur OLE DB. Lorsque le fournisseur OLE DB SQL Server Native Client envoie une commande pour exécution, SQL Server exécute les instructions et retourne les résultats.

Un client doit traiter tous les résultats d'exécution de commande. Étant donné que l’exécution SQL Server Native Client commande du fournisseur OLE DB peut générer des objets d’ensemble de lignes multiples en tant que résultats, utilisez l’interface IMultipleResults pour vous assurer que la récupération des données d’application termine l’aller-retour initié par le client.

L’instruction Transact-SQL suivante génère plusieurs ensembles de lignes, certains contenant les données de ligne de la table OrderDetails et d’autres les résultats de la clause 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  

Si un consommateur exécute une commande contenant ce texte et demande un ensemble de lignes comme interface de résultats retournée, seul le premier jeu de lignes est retourné. Le consommateur peut traiter toutes les lignes dans l'ensemble de lignes retourné. Toutefois, si la propriété de source de données DBPROP_MULTIPLECONNECTIONS a la valeur VARIANT_FALSE et que MARS n’est pas activé sur la connexion, aucune autre commande ne peut être exécutée sur l’objet de session (le fournisseur OLE DB SQL Server Native Client ne crée pas une autre connexion) tant que la commande n’est pas annulée. Si MARS n’est pas activé sur la connexion, le fournisseur OLE DB SQL Server Native Client retourne une erreur DB_E_OBJECTOPEN si DBPROP_MULTIPLECONNECTIONS est VARIANT_FALSE et retourne E_FAIL s’il existe une transaction active.

Le fournisseur OLE DB SQL Server Native Client retourne également DB_E_OBJECTOPEN lors de l’utilisation de paramètres de sortie en continu et l’application n’a pas consommé toutes les valeurs de paramètres de sortie retournées avant d’appeler IMultipleResults::GetResults pour obtenir le jeu de résultats suivant. Si MARS n’est pas activé et que la connexion est occupée à exécuter une commande qui ne produit pas d’ensemble de lignes ou qui produit un ensemble de lignes qui n’est pas un curseur de serveur, et si la propriété de source de données DBPROP_MULTIPLECONNECTIONS est définie sur VARIANT_TRUE, le fournisseur OLE DB SQL Server Native Client crée des connexions supplémentaires pour prendre en charge les objets de commande simultanés, sauf si une transaction est active, dans ce cas, il retourne une erreur. Les transactions et le verrouillage sont gérés par SQL Server connexion par connexion. Si une deuxième connexion est générée, la commande sur les connexions séparées ne partage pas les verrous. Prenez soin de vérifier qu'une commande n'en bloque pas une autre en maintenant les verrous sur les lignes demandées par l'autre commande. Si MARS est activé, plusieurs commandes peuvent être actives sur les connexions et si les transactions explicites sont utilisées, les commandes partagent toutes une transaction commune.

Le consommateur peut annuler la commande en utilisant ISSAbort::Abort ou en libérant toutes les références détenues sur l’objet de commande et l’ensemble de lignes dérivé.

L’utilisation de IMultipleResults dans toutes les instances permet au consommateur d’obtenir tous les ensembles de lignes générés par l’exécution de la commande et permet aux consommateurs de déterminer de façon appropriée à quel moment annuler l’exécution de la commande et libérer un objet session en vue d’une utilisation par d’autres commandes.

Notes

Lorsque vous utilisez les curseurs SQL Server, l'exécution de commande crée le curseur. SQL Server retourne une valeur indiquant si la création du curseur a réussi ou échoué ; par conséquent, l'aller-retour vers l'instance de SQL Server se termine au retour de l'exécution de commande. Chaque appel de GetNextRows devient alors un aller-retour. De cette façon, plusieurs objets de commande actifs peuvent exister, chacun traitant un ensemble de lignes qui est le résultat d'une extraction du curseur côté serveur. Pour plus d’informations, consultez Ensembles de lignes et curseurs SQL Server.

Voir aussi

Commandes