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 :

mysql.data : comment connaitre le nombre de ligne dans un MySqlDataReader ?


Sujet :

C#

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut mysql.data : comment connaitre le nombre de ligne dans un MySqlDataReader ?
    salut,

    comment connaitre le nombre de ligne renvoyé par une requete MySQL de type SELECT ?
    (sans faire une boucle sur l'intégralité des résultats)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // creation de la requete
    MySqlCommand cmd = new MySqlCommand("SELECT * FROM client", _conn);
     
    // recuperation des données dans reader 
    MySqlDataReader reader = cmd.ExecuteReader();
    je sais que reader est de type IEnumerable et qu'il n'a aucune propriété Length ou Count et aussi qu'il ne peut qu'avancer dans sa liste de résultat ...
    avec tout ceci je pense que la seule manière de connaitre le nombre total de résultat est de faire un cast vers un autre type (List<string[]> ?) qui possede une propriété Count ou Length.

    j'ai donc tenté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<string[]> maListe = reader.Cast<List<string[]>>();
    et je choppe cette erreur :
    Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.List<string[]>>' en 'System.Collections.Generic.List<string[]>'. Une conversion explicite existe (un cast est-il manquant*?)

    quelqu'un aurait une idée sur la maniere de faire le cast() ?

    merci

  2. #2
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Lorenzo

    Pour ma par je n'utilise jamais de reader mais un adapter et un dataset, j'ai fais une petite classe query pour ca (voir ci dessous)

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    using System;
    using System.Collections.Generic;
    using System.Text;
    using MySql.Data.MySqlClient;
    using System.Windows.Forms;
    using System.Data;
     
     
    namespace Recutex
    {
      class Query
      {
        public DataTable selectX(string SelectCmd)
        {
     
          MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection();
          conn.ConnectionString = Environ.ConnectionString;
          try
          {
            conn.Open();
          }
          catch (MySqlException e)
          {
            MessageBox.Show(e.Message);
            return null;
          }
     
          MySqlDataAdapter ada = new MySqlDataAdapter();
     
          DataSet ds;
          try
          {
            ada.SelectCommand = new MySqlCommand(SelectCmd, conn);
            ds = new DataSet();
     
            ada.Fill(ds);
          }
          catch (MySqlException e)
          {
            MessageBox.Show(e.Message);
            return null;
          }
     
          conn.Close();
          return ds.Tables[0];
        }
       }
    }

  3. #3
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    salut olibara !

    je ne connaissais pas du tout ces classes, je viens de faire un test et c'est rapide, je vais faire plus de test pour bien comprendre comment ca fonctionne car il y a un une grande arborescence de classe qui est lié a DataSet ...

    merci

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Pour ma part je n'utilise actuellement le dataset que comme container pour le resultat du query, parfois aussi pour l'update

    Mais je recupere la datatable qui est un composant tres souple pour la manipulation de données

  5. #5
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    j'ai passé un bon bout de la nuit a tester et le seul problème que j'ai rencontré c'est en passant la DataTable a une DataGridView ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (dataSet.Tables.Count > 0)
    {
        dataGridView1.DataSource = dataSet.Tables[0];
    }
    les valeurs null provoquent des résultats très bizarre :
    -soit il n'y a aucun affichage (chaine vide)
    -ou alors j'ai une image blanche avec un x rouge

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Lorenzo

    Quelles valeurs nulles ?

    Pour ma part des DataTables et des DGV j'en bouffe tous les jours a toutes les sauce et je n'ai jamais le genre de problème dont tu parle

    Maintenant qu'une valeur nulle dans la DB te donne une cellule blanche dans le DGV, je ne vois pas ce que tu peux attendre d'autre ??

    Deux regles importantes

    1- TOUJOURS remetre la DataSource du DGV a null avant de l'assigner

    2- TOUJOURS faire un clear de ton DataSet

  7. #7
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    null n'est pas une chaine vide, c'est bien la tout le problème, je vais être obligé de passer sur toutes les valeurs et de faire une conversion quelconque.

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    null n'est pas une chaine vide, c'est bien la tout le problème, je vais être obligé de passer sur toutes les valeurs et de faire une conversion quelconque.
    Salut

    J'entends bien que null n'est pas empty
    Mais je ne comprends pas bien ou est le veritable probleme et ce qui t'oblige a tout parcourir pour verifier si c'est null ?

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Je n'ai toujours pas bien compris ton probleme mais si c'est de distinguer a l'affichage un Empty ou un null

    Tu peux utiliser (je pense)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView.DefaultCellStyle.NullValue="null";

  10. #10
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    salut

    oui, tu as bien compris mon problème ..

    je viens de tester ta soluce et ca marche ... presque, j'ai pris comme exemple une requete simple qui renvoit des NULL :
    EXPLAIN SELECT * FROM matable

    le probleme dans la DataGrid avec cette requete est au niveau de la colonne key_len (voir PNG pour comprendre la "croix rouge")

    affichage dans phpMyAdmin : a1.png
    affichage dans DataGridView : a2.png

    je pense que cette colonne doit en réalité renvoyer autre chose qu'un NULL ou alors elle a des propriétés particulieres que n'ont pas les autres colonnes renvoyés.
    Images attachées Images attachées   

  11. #11
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    ok, j'ai compris :
    toutes les autres colonnes ont un DataType qui est System.String ou System.UInt64 mais celle la est de type System.Byte[]
    c'est ce qui provoque l'affichage bizarre ...

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Ce qui est curieux c'est pourquoi to len_key retourne un byte[]

    J'ai fais la meme requete chez moi : aucun probleme

    N.B. : Je me suis fais une petite form sql viewer avec un DGV et un textbox pour faire mon select

    Et j'ai un print pour le result !

  13. #13
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    l'appli qu'il y a sur la photo a2.png c'est exactement ca ... ca m'évite de passer par phpMyAdmin qui est lent même en local.

    key_len contient la liste des tailles maximales de clés pouvant être utilisés, donc le tableau de byte (0 a 255) me parait logique.
    ce qui est bizarre c'est que le DataType de cette colonne a une autre valeur chez toi si on a bien la meme version de MySQL (5.0.33)

  14. #14
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    5.0.27 cette info est NULL !!
    Je viees d'essayer sur une table qui a 4 index

Discussions similaires

  1. Comment obtenir le nombre de ligne dans une requête ?
    Par totoAussi dans le forum Requêtes
    Réponses: 8
    Dernier message: 06/09/2011, 17h28
  2. Comment compter le nombre de ligne dans un Array dynamique?
    Par NewYork dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/03/2011, 17h21
  3. Connaitre le nombre de ligne dans un groupe
    Par lilou77 dans le forum BIRT
    Réponses: 4
    Dernier message: 13/06/2007, 15h27
  4. Réponses: 2
    Dernier message: 13/06/2006, 15h46
  5. [VBA-E] connaitre le nombre de ligne dans un tableau excel
    Par bigbarbe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/04/2006, 10h03

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