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

Windows Forms Discussion :

Comment compter le nombre d'enregistrements d'un DataReader ?


Sujet :

Windows Forms

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut Comment compter le nombre d'enregistrements d'un DataReader ?
    Bonsoir à tous.

    Je suis actuellement en train de développer une classe SQL pour la réalisation d'un projet, et j'ai un problème pour compter le nombre d'enregistrement dans un DataReader dans une méthode. Voici le code de ma méthode :
    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
    public string[] SQLSelect_nx1(string unChamp, string uneTable)
    {
        this.fctConnectDB();
        OdbcCommand cmdSelect = new OdbcCommand();
        cmdSelect.Connection = connectionDB;
        cmdSelect.CommandText = "SELECT " + unChamp + " FROM " + uneTable + "";
        OdbcDataReader DR;
        DR = cmdSelect.ExecuteReader();
     
        DR.Read();
        int i = DR.VisibleFieldCount;
        string[] tabJeuEnregistrement = new string[i];
        for (int j = 0; j < tabJeuEnregistrement.Length; j++)
        {
            for (int k = 0; k < i; k++)
            {
                tabJeuEnregistrement[j] = DR.GetString(k);
            }
        }
        DR.Close();
     
        fctDeconnectDB();
        return tabJeuEnregistrement;
    }
    Tel que je le fais là, DR.VisibleFieldCount ne me renvoi qu'un seul enregistrement, alors que ma table en contient 9.

    Comment faire pour compter le nombre d'enregistrement dans un DataReader ?

    Merci d'avance.

  2. #2
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Tel que je le fais là, DR.VisibleFieldCount ne me renvoi qu'un seul enregistrement, alors que ma table en contient 9.
    VisibleFieldCount renvoie le nombre de champs (colonnes), pas le nombre d'enregistrements (lignes).

    Citation Envoyé par DarkSeiryu Voir le message
    Comment faire pour compter le nombre d'enregistrement dans un DataReader ?
    Il faut lire le reader jusqu'au bout... Les enregistrements ne sont pas vraiment "dans" le DataReader, ce dernier pointe sur 1 enregistrement à la fois. La plupart des SGBD ne renvoient pas le nombre total de lignes de résultat, car ils commencent généralement à renvoyer des résultats avant de savoir combien il y en a...

  3. #3
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Merci de ta réponse.
    Citation Envoyé par tomlev
    Il faut lire le reader jusqu'au bout...
    D'accord, mais comment je fais ça ?

  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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    D'accord, mais comment je fais ça ?
    Ben tu appelles la méthode Read en boucle, jusqu'à ce qu'elle renvoie false...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    n = 0;
    while(DR.Read())
    {
        n++;
    }

  5. #5
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    ok merci j'essaierai ça ce soir là je peux pas.

    Par contre juste une question, vu qu'il y a while(DR.Read()), est-ce qu'il est utile de mettre DR.Close() à la fin du while ou une fois que j'ai rempli mon tableau ?
    En clair j'ai fait ça :
    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
    int n;
    		while (DR.Read())
    		{
    			n++
    		}
    		string[] tabJeuEnregistrement = new string[n];
    		for (int j = 0; j < n; j++)
    		{
    			for (int k = 0; k < n; k++)
    			{
    				tabJeuEnregistrement[j] = DR.GetString(k);
    			}
    		}
    		DR.Close();
            fctDeconnectDB();
            return tabJeuEnregistrement;

  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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Par contre juste une question, vu qu'il y a while(DR.Read()), est-ce qu'il est utile de mettre DR.Close() à la fin du while ou une fois que j'ai rempli mon tableau ?
    Ben il faut remplir ton tableau dans le while... une fois que tu as lu entièrement le reader, tu ne peux plus revenir en arrière. Ton dernier code ne fonctionne pas à mon avis, vu que tu as déjà atteint la fin du reader...

    Pourquoi tu utilises un tableau ? Ce n'est vraiment pas très pratique quand tu ne connais pas à l'avance le nombre de lignes...
    Utilise plutôt une List<string>, ou une DataTable...

    Sinon, plutôt que de faire explicitement le Close, tu peux aussi utiliser un bloc using :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using(OdbcDataReader DR = cmdSelect.ExecuteReader())
    {
        ...
    }
    La méthode Dispose sera automatiquement appelée à la fin du bloc, et cette méthode appelle Close

  7. #7
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Pourquoi pas un DataSet ?

  8. #8
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par tomlev
    Pourquoi tu utilises un tableau ? Ce n'est vraiment pas très pratique quand tu ne connais pas à l'avance le nombre de lignes...
    Utilise plutôt une List<string>, ou une DataTable...
    Je veux que ma méthode me retourne un tableau car j'ai besoin ensuite dans une autre classe de faire un random sur le tableau retourné et qu'ensuite, grâce au nombre obtenu par le random, j'affiche le string correspondant dans la ligne de mon tableau, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public string showDemons()
    {
        string[] tabJeuEnregistrement = cs_SQL.SQLSelect_nx1("demNom", "demons");
        Random rdm = new Random();
        int i = rdm.Next(0, tabJeuEnregistrement.Length);
        string nomDemons = tabJeuEnregistrement[i];
        return nomDemons;
    }
    Et comment je fais dans ma classe SQL pour remplir mon tableau dans le while est ensuite le retourner ?
    Je gallères à mort...

    Merci d'avance !

    EDIT : au fait, je fais ça pour un site (ASP.NET donc) et apparemment je ne peux pas utiliser de List<string>, peut-être est-ce parce que je suis sous VS 2008 ? Et je sais qu'il y a un forum spécial ASP mais comme ma question portait sur du C# pur, j'ai préféré venir ici...

  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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Je veux que ma méthode me retourne un tableau car j'ai besoin ensuite dans une autre classe de faire un random sur le tableau retourné et qu'ensuite, grâce au nombre obtenu par le random, j'affiche le string correspondant dans la ligne de mon tableau, comme ceci :
    Ben tu peux très bien faire la même chose avec un List<string>...

    EDIT: j'avais pas vu ton EDIT
    Si tu es sous VS2008, tu as le framework 3.5, donc tu as forcément la classe List<T>. Ajoute un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Collections.Generic;

  10. #10
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ah ouais moins casse-tête avec une List<string>

    Par contre j'ai une erreur lors de la compilation :
    Utilisation d'une variable locale non assignée "listNomDemons"
    Voici le code de ma méthode (l'erreur se situe à la ligne en gras) :
    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
    public List<string> SQLSelect_nx1(string unChamp, string uneTable)
    {
        this.fctConnectDB();
        OdbcCommand cmdSelect = new OdbcCommand();
        cmdSelect.Connection = connectionDB;
        cmdSelect.CommandText = "SELECT " + unChamp + " FROM " + uneTable + ";";
        OdbcDataReader DR;
        DR = cmdSelect.ExecuteReader();
    
        List<string> listNomDemons;
        int i = 0;
        while (DR.Read())
        {
            listNomDemons.Add(DR.GetString(i));
            i++;
        }
        DR.Close();
        return listNomDemons;
    }

  11. #11
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Ben le message est assez clair je trouve... tu as déclaré listNomDemons, mais tu ne l'as pas initialisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<string> listNomDemons = new List<string>();

  12. #12
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ah ben oui effectivement... Comment j'ai pu oublier ça ?

    Enfin bref, maintenant ça marche niquel.

    Ce qui m'étonne d'ailleurs lol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<string> myList = new List<string>();
    int i = 0;
    while (DR.Read())
    {
        myList.Add(DR.GetString(i));
    }
    DR.Close();
    return myList;
    Comme on peut le voir, je laisse toujours i à 0 et pourtant myList reçoit bien tous les enregistrements qui sont dans le DataReader, et j'ai du mal à comprendre pourquoi... Parce que ça ne renvoit qu'un enregistrement à la fois comme tu me l'as dit y'a deux jours tomlev ?

  13. #13
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    GetString(i) signifie que tu récupères le "i-ième" champ de l'enregistrement courant. C'est l'index de la colonne, pas de la ligne... Et comme tu ne sélectionnes qu'une colonne, tu fais toujours GetString(0), la variable i est donc inutile...

    Quelques petits rappels sur les DataReaders :
    http://dotnet.developpez.com/articles/ado1/csharp/

  14. #14
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    ok niquel ^^

    Merci bien tomlev !

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

Discussions similaires

  1. [Débutant] comment compter le nombre d'enregistrements
    Par djdidi2010 dans le forum C#
    Réponses: 1
    Dernier message: 19/04/2013, 17h43
  2. Comment compter le nombre d'enregistrement
    Par y-bab dans le forum IHM
    Réponses: 1
    Dernier message: 09/08/2008, 13h07
  3. Réponses: 6
    Dernier message: 11/02/2005, 06h41
  4. [SQL][ACCESS]Compter le nombres d'enregistrement dans deux..
    Par pc152 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/06/2004, 12h30
  5. Comment compter le nombre de lettre identique ?
    Par divableue dans le forum ASP
    Réponses: 3
    Dernier message: 07/11/2003, 15h01

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