IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Ouverture de plusieurs DataReader


Sujet :

C#

  1. #1
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut [C#] Ouverture de plusieurs DataReader
    Bonjour,

    Je réalise suivant un tutoriel de developpez.com une application en couche.
    Dans ma couche d'accès aux données, j'ai ce genre de chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    using (DbDataReader reader = cmd.ExecuteReader())
    {
             while (reader.Read())
             {}
    }
    Le problème, c'est que pendant la récupération du reader1 , j'ouvre un autre reader. Malheuresement j'ai l'erreur suivante qui se génère:
    Un datareader est déja associé à cette commande.
    Comment faire pour réoudre mon problème ?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Pfeffer Voir le message
    Le problème, c'est que pendant la récupération du reader1 , j'ouvre un autre reader.
    On peut pas.

    Comment faire pour réoudre mon problème ?
    Ne pas ouvrir deux reader sur la même connection en même temps (et en général ce n'est pas utile).

  3. #3
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    Chaque fois que tu veut ouvrir un nouveau reader sur la meme connexion ferme d'abord le premier qui utilise la connexion.
    Notez que pendant l'ouverture d'un DataReader, Connection est utilisé en mode exclusif par ce DataReader. Vous ne pouvez pas exécuter de commandes pour Connection, y compris la création d'un autre DataReader, jusqu'à la fermeture du DataReader d'origine. (msdn)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Ne pas ouvrir deux reader sur la même connection en même temps (et en général ce n'est pas utile).
    Si, on peut tout à fait ouvrir 2 readers sur une même connection (du moins avec les SGBD que je connais). Il faut juste utiliser un autre objet Command : pour une commande donnée, il ne peut y avoir qu'un seul reader ouvert

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Si, on peut tout à fait ouvrir 2 readers sur une même connection (du moins avec les SGBD que je connais). Il faut juste utiliser un autre objet Command : pour une commande donnée, il ne peut y avoir qu'un seul reader ouvert
    Désolé mais je ne suis pas d'accord. Ceci dit je vais essayer de trouver 5mn pour tester d'ici ce soir.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Désolé mais je ne suis pas d'accord. Ceci dit je vais essayer de trouver 5mn pour tester d'ici ce soir.
    Bon, j'ai fait le test histoire d'en avoir le coeur net... et il semblerait que j'ai à la fois raison et tort
    Ca fonctionne avec Oracle, mais pas avec SQL Server (2005). J'ai plus l'habitude d'Oracle et je savais que ça marchait, j'ai supposé à tort que c'était le cas aussi pour SQL Server...

    Mon test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
                using (DbCommand command = connection.CreateCommand())
                {
                    command.CommandText = "SELECT X FROM TOTO";
                    using (DbDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            using (DbCommand command2 = connection.CreateCommand())
                            {
                                //command2.CommandText = "SELECT COUNT(1) NB FROM TOTO WHERE X = @x";
                                command2.CommandText = "SELECT COUNT(1) NB FROM TOTO WHERE X = :x";
                                DbParameter prm = command2.CreateParameter();
                                //prm.ParameterName = "@x";
                                prm.ParameterName = ":x";
                                prm.DbType = DbType.String;
                                prm.Value = reader["X"];
                                command2.Parameters.Add(prm);
                                using (DbDataReader reader2 = command2.ExecuteReader())
                                {
                                    while (reader2.Read())
                                    {
                                        Console.WriteLine("{0} : {1}", reader["X"], reader2["NB"]);
                                    }
                                }
                            }
                        }
                    }
                }
    Avec SQL Server ça plante sur le 2e ExecuteReader(), avec le message d'erreur indiqué par Pfeffer. Ce message est d'ailleurs assez inadéquat je trouve, vu que j'utilise une 2e commande...

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bon, j'ai fait le test histoire d'en avoir le coeur net... et il semblerait que j'ai à la fois raison et tort
    Ca fonctionne avec Oracle, mais pas avec SQL Server. J'ai plus l'habitude d'Oracle et je savais que ça marchait, j'ai supposé à tort que c'était le cas aussi pour SQL Server...
    Et comme de mon coté j'ai pas mal de pratique avec Sql Server et assez peu avec Oracle .... ceci explique cela

  8. #8
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut
    Quelles sont donc les solutions pour moi ?
    Le problème c'est que je récupère une liste d'information (dans mon 1er reader) et également une autre liste d'information (dans mon 2ème reader) de manière imbriquée!

    Cela s'explique par le fait que j'ai une association entre l'objet 1 qui peut comporter une liste d'objet 2!

    L'idéal serait que se soit possible! Mais cela ne fonctionne pas!
    Cela signifierait il que je dois refermer le reader, pour ensuite passer en paramètre (par référence) à ma deuxième méthode l'objet 1, dont la liste sera mis à jour par le deuxième reader ?

    Je ne sais pas si vous me comprenez...
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    Obj1 = getObj1();
    updateWithListObj2(ref obj1);

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    ben il suffit de faire une jointure...

  10. #10
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,

    Sinon, y'a les DataSet, c'est simple et déconnecté. Par contre, pour les gros volumes de données c'est plus lent.

    Sinon, ouvrir une deuxième connexion. C'est pas un drame si tu gagnes en perf et en mémoire. Faut pas être rigide.

    A+

  11. #11
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut
    Finalement, je suis passé par des Dataset. De cette manière je suis en mode déconnecté ce qui facilite les choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Plannification d'ouverture de plusieurs formulaires
    Par Alexandr dans le forum Access
    Réponses: 5
    Dernier message: 27/10/2006, 11h04
  2. [VB6] Ouverture de plusieurs fichiers textes
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/09/2006, 10h45
  3. Ouverture de plusieurs connections?
    Par johnkro dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 21/07/2006, 10h43
  4. Eclipse : ouverture de plusieurs fichiers
    Par menuge dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 15/05/2006, 09h54
  5. [Plugin]plug in d'ouverture de plusieurs projets
    Par cymp dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 03/11/2005, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo