2010-03-01 5 views
9

Comment puis-je implémenter un SqlDataReader dans un autre SqlDataReader?SqlDataReader à l'intérieur de SqlDataReader

Mon problème est que j'ai un SqlDataReader. Je publie while (reader.read()) et à l'intérieur de la boucle while je dois créer un autre SqlDataReader à lire à partir de la base de données. Mais je reçois des exceptions à propos de la connexion étant déjà ouverte.

Alors, quelle est la meilleure façon de résoudre mon problème?

Edit:

J'utilise clr pour créer mes procédures stockées. J'ai essayé de mettre MultipleActiveResultSets=true; dans la chaîne de connexion à la fois le clr et le projet, et une exception a eu lieu quand je testé mon procédure stockée sur SQL Server:

System.InvalidOperationException: Il existe déjà un DataReader ouvert associé cette commande qui doit être fermée en premier.

+0

Utilisez-vous la même connexion avec le précédent SqlDataReader? Avez-vous essayé d'en créer un nouveau? –

+0

oui sûr. J'ai essayé d'en créer un nouveau, la chose est que j'utilise clr, cela fonctionne quand je déploie mais quand j'utilise la procédure stockée dans mon application une exception se produit ... – scatman

Répondre

18

Vous devez disposer de deux lecteurs de données imbriqués, ce qui nécessite la fonctionnalité "MARS" ADO.NET - Ensembles de résultats actifs multiples.

Il est disponible à partir de ADO.NET 2.0 et nécessite un réglage spécifique (MultipleActiveResultSets=true;) dans la chaîne de connexion:

Server=.\SQLEXPRESS;Database=master;Integrated Security=SSPI; 
    MultipleActiveResultSets=true; 

Voir cette blog post pour une excellente discussion.

Une fois que vous avez cela, vous devriez pouvoir avoir plus d'un SqlDataReader partagé sur le même SqlConnection dans votre code, et les utiliser indépendamment les uns des autres.

MISE À JOUR: cette blog post here mentionne que la fonction MARS est pas disponible dans l'environnement SQL CLR :-(donc qui ne fonctionne pas dans un CLR SQL stocké proc ....

+0

cela fonctionne aussi si j'utilise clr et stocké procédures? – scatman

+0

oui, il devrait certainement (tant qu'ils utilisent la même connexion, par exemple une chaîne de connexion ** identique ** - identique jusqu'à la dernière virgule et les espaces blancs!) –

+0

bien que cela n'a pas fonctionné lors de l'utilisation de clr. Après avoir créé ma procédure stockée, j'ai essayé de la tester sur MS-SQL et une erreur s'est produite qui a déclaré que: System.InvalidOperationException: Il existe déjà un DataReader ouvert associé à cette commande qui doit être fermé en premier. – scatman

5

La question que vous » Si vous rencontrez un problème, vous tentez d'ouvrir plusieurs lecteurs de données sur la même connexion db, ce qui vous donnera une exception car il indiquera qu'il y en a déjà un associé - comme vous l'avez vu. pourrait utiliser MultipleActiveResultsets, où à partir de .NET 2.0 & SQL Server 2005, vous pouvez spécifier un op tion dans la chaîne de connexion pour permettre à plusieurs resultsets actifs contre une seule connexion db en ajoutant:

MultipleActiveResultSets=True; 

L'alternative consiste à utiliser une connexion différente pour ouvrir le lecteur de données interne contre.

Ou même, il est possible de repenser votre approche originale - peut-être y at-il un moyen de le faire sans lecteurs imbriqués.

Questions connexes