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 l'exécution de commande du fournisseur OLE DB SQL Server Native Client. Lorsque le fournisseur OLE DB SQL Server Native Client soumet une commande en vue de son 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. Comme l'exécution de commande du fournisseur OLE DB SQL Server Native Client peut générer plusieurs objets d'ensembles de lignes comme résultats, utilisez l'interface IMultipleResults pour garantir que l'extraction de données de l'application termine la boucle initialisée par le client.

L'instruction Transact-SQL suivante génère plusieurs ensembles de lignes, certaines 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é. Cependant, si la propriété de la source de données DBPROP_MULTIPLECONNECTIONS est définie avec 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 session (le fournisseur OLE DB SQL Server Native Client ne crée pas une autre connexion) jusqu'à ce que la commande soit 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 a la valeur 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 diffusée en continu et si l'application n'a pas utilisé toutes les valeurs des paramètres de sortie retournées avant d'appeler IMultipleResults::GetResults pour obtenir le prochain jeu de résultats. Si MARS n'est pas activé et que la connexion est occupée à exécuter une commande qui ne produit pas un ensemble de lignes ou produit un ensemble de lignes qui n'est pas un curseur côté serveur, et que la propriété de la source de données DBPROP_MULTIPLECONNECTIONS a la valeur VARIANT_TRUE, le fournisseur OLE DB SQL Server Native Client crée des connexions supplémentaires pour prendre en charge les objets de commande concurrentiels à moins qu'une transaction ne soit active, auquel cas une erreur est retournée. 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 d'IMultipleResults dans toutes les instances permet au consommateur d'obtenir tous les ensembles de lignes généré par l'exécution de commande et autorise les consommateurs à déterminer de façon appropriée à quel moment annuler l'exécution de commande et libérer un objet session en vue d'une utilisation par les autres commandes.

[!REMARQUE]

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 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

Concepts