2009-10-22 10 views
1

Je reçois l'erreur suivante;DataReader associé à cette commande qui doit être fermée en premier

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

est-ce parce que j'ai utilisé le lecteur dans la boucle foreach? ou quel pourrait être le problème? Cordialement BK

foreach(Apple a in listApple) 
{ 


.... 
        using (SmartSqlReader reader = Db.CurrentDb.ExecuteReader(sp)) 
        { 
         while (reader.Read()) 
         { 
          a.blablabla += reader.GetInt32("BLA_BLA_BLA"); 
         } 
        } 


..... 

} 
+0

ce fut mon erreur. Je l'ai trouvé dans une enquête approfondie. J'ai utilisé if (reader.Read()) au lieu d'utiliser using et whil loops. tous résolus. merci bk – theklc

Répondre

1

les opérations suivantes:

using (SmartSqlReader reader = Db.CurrentDb.ExecuteReader(sp)) 
{ 
    while (reader.Read()) 
    { 
    a.blablabla += reader.GetInt32("BLA_BLA_BLA"); 
    } 
    reader.Close(); 
} 
+6

Il est inutile d'avoir le bloc using là-bas s'il ne fait rien, ou en fait * pire * que inutile car il * ressemble * il devrait faire quelque chose ... – Guffa

1

Ajouter reader.Close() pour fermer la SmartSqlReader

3

Avez-vous implemeneted la SmartSqlReader fermer quand il est disposé? Les lecteurs de données réguliers implémentent l'interface IDisposable et appellent Close à partir de la méthode Dispose.

Si vous ne le fermez pas correctement, il conservera l'objet Command occupé jusqu'à ce que le garbage collector trouve le lecteur et le nettoie.