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 commandes du fournisseur OLE DB SQL Server Native Client. Lorsque le fournisseur OLE DB SQL Server Native Client envoie une commande pour l’exécution, SQL Server exécute les instructions et retourne tous les résultats.

Un client doit traiter tous les résultats de l’exécution de commandes. Étant donné que l’exécution de la commande du fournisseur OLE DB SQL Server Native Client 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 de l’application termine l’aller-retour initié par le client.

L’instruction Transact-SQL suivante génère plusieurs ensembles de lignes, certains contenant des données de ligne de la table OrderDetails et certains 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 en tant qu’interface de résultats retournée, seul le premier ensemble de lignes est retourné. Le consommateur peut traiter toutes les lignes de l’ensemble de lignes retourné. Toutefois, si la propriété de source de données DBPROP_MULTIPLECONNECTIONS est définie sur 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 des paramètres de sortie en continu et l’application n’a pas consommé toutes les valeurs de paramètre 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, auquel cas elle retourne une erreur. Les transactions et le verrouillage sont gérés par SQL Server par connexion. Si une deuxième connexion est générée, la commande sur les connexions distinctes ne partage pas de verrous. Veillez à ce qu’une commande ne 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 des transactions explicites sont utilisées, toutes les commandes partagent une transaction commune.

Le consommateur peut annuler la commande en utilisant ISSAbort ::Abort ou en libérant toutes les références conservées 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és par l’exécution de commandes et permet aux consommateurs de déterminer de manière appropriée quand annuler l’exécution de la commande et libérer un objet de session à utiliser par d’autres commandes.

Remarque

Lorsque vous utilisez des curseurs SQL Server, l’exécution de commandes crée le curseur. SQL Server retourne la réussite ou l’échec lors de la création du curseur ; par conséquent, l’aller-retour vers l’instance de SQL Server est terminé lors du retour de l’exécution de la commande. Chaque appel GetNextRows devient alors un aller-retour. De cette façon, plusieurs objets de commande actifs peuvent exister, chaque traitement d’un ensemble de lignes résultant d’une extraction à partir du curseur du serveur. Pour plus d’informations, consultez Ensembles de lignes et curseurs SQL Server.

Voir aussi

Commandes