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 :

Probléme de recupération de données avec la base de données


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Probléme de recupération de données avec la base de données
    Bonjour a tous,

    Alors voila mon problème, j'ai créé un logiciel en c# avec visual studio qui exploite une base de données. Le but est de savoir avec quoi est équipé un bureau et où il se situe.
    Mon problème se pose lorsque je souhaite récupérer le plus grand ID_poste qui est la clef primaire de la table et qui est aussi en auto incrémentation.
    Je pense que cette explication devrait suffire pour comprendre le bout de code qui ne fonctionne pas.
    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
    SqlConnection myConnection;
                SqlCommand myCommand;
                string myConnectionString;        
     
                myConnectionString = "user id=sa;password=password69;initial catalog=Config_bureau;data source=JO-PC\\SQLEXPRESSMAJ;Connect Timeout=10;"; // chaine de connection a la bdd
     
                string strRequete = "SELECT MAX (ID_poste) AS max FROM dbo.Poste;"; // la fameuse requete
                int id_poste = 0;            
                try
                {
                    myConnection = new SqlConnection(myConnectionString);
                    myConnection.Open();
                    myCommand = new SqlCommand(strRequete, myConnection);
                    SqlDataReader mySqDataReader = myCommand.ExecuteReader();
                    {
                        if (mySqDataReader["ID_poste"] != System.DBNull.Value)
                        {
                            id_poste = (Int32)mySqDataReader["ID_Poste"];
                        }
                    }
                    myConnection.Close();
                }
                finally
                {
                    tb_ajout_peri_ID_poste.Text = Convert.ToString(id_poste);
                    // cette partie sert a ce que la text box soit pré-rempli
                }
    PS: le message d'erreur est le suivant:
    L'exception IndexOutOfRangeExecption n'a pas été gérer. Il pointe sur la condition if (mySqDataReader["ID_poste"] != System.DBNull.Value).
    Or je ne vois pas pourquoi je devrais récupérer avec une liste ou un tableau cette info. (j'ai déjà essayé la requête sur ma base de données et elle fonctionne)

    Merci pour le temps passé à lire ce message

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Cette erreur signifie :

    Une exception IndexOutOfRangeException est levée lors d'une tentative d'accès à un élément d'un tableau ou d'une collection ayant un index en dehors des limites du tableau ou inférieur à zéro.

    Source MSDN
    Tu peut avant le Finally mettre un Catch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      catch (Exception ex)
                {
                    MessageBox.show(ex.Message);
     
                }
    Ps : utilise la balise CODE
    Life myLife = new Life ("eat","sleep","code");

  3. #3
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Pour ton problème a mon avis, ça vient de ce que ton datareader ne contient pas la colonne ID_poste, mais mon petit doigt me dit que la colonne pourrait s'appeler max.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX (ID_poste) AS max FROM dbo.Poste;

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : février 2010
    Messages : 3 611
    Points : 9 744
    Points
    9 744
    Billets dans le blog
    3
    Par défaut
    Il faut parcourir ton SQL Data Reader, en adaptant ton code comme ceci ça devrait aller mieux :


    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SqlDataReader mySqDataReader = myCommand.ExecuteReader();
     
    while (mySqDataReader.Read())
    {
        if (mySqDataReader["ID_poste"] != System.DBNull.Value)
        {
            id_poste = (Int32)mySqDataReader["ID_Poste"];
        }
    }
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    @benny-blanco
    bien vue pour la balise code je n'y avais pas penser. Après avoir rajouter ton morceau de code il m'affiche ID_Poste puis 0. Ce champs de colonne existe bien pourtant.


    @Arthis
    Oui je sais, mon orthographe est pas top ...
    Non la colonne ne s'appelle pas max elle s'appelle ID_Poste.

    PS: pour le fonctionnement des forum ce n'est pas mon fort.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Matt07 Voir le message
    Il faut parcourir ton SQL Data Reader, en adaptant ton code comme ceci ça devrait aller mieux :


    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SqlDataReader mySqDataReader = myCommand.ExecuteReader();
     
    while (mySqDataReader.Read())
    {
        if (mySqDataReader["ID_poste"] != System.DBNull.Value)
        {
            id_poste = (Int32)mySqDataReader["ID_Poste"];
        }
    }
    Toujours le même problème :s

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    J'ai essayer chez moi est ce code marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      protected void Page_Load(object sender, EventArgs e)
        {
           this.literalGenre.Text =  test().ToString();
        }
    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
     
     public int test()
        {
            string ChainedeConnexion = "Data Source=JEROME-PC\\SQLEXPRESS;Initial Catalog=myTunes;Integrated Security=True";
     
            SqlConnection myConnection;
            SqlCommand myCommand;
            string myConnectionString;
     
            myConnectionString = ChainedeConnexion;
     
            string strRequete = "SELECT MAX (idalbum) FROM album;"; // la fameuse requete
            int id_poste = 0;
            try
            {
                myConnection = new SqlConnection(myConnectionString);
                myConnection.Open();
                myCommand = new SqlCommand(strRequete, myConnection);
                SqlDataReader mySqDataReader = myCommand.ExecuteReader();
     
     
                while (mySqDataReader.Read())
                {
                    id_poste = mySqDataReader.GetInt32(0);
                }
     
                myConnection.Close();
                return id_poste;
            }
     
            catch (SqlException)
            {
                return 0;
                //this.literalGenre.Text = ex.Message;
            }
     
        }
    Life myLife = new Life ("eat","sleep","code");

  8. #8
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    je recommence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX (ID_poste) AS max FROM dbo.Poste;
    tu ecris "as max" cela signifie que la requete aura pour nom de colonne "max".

    donc ton datareader connaitra max comme nom de colonne a mon avis...

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Arthis Voir le message
    je recommence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX (ID_poste) AS max FROM dbo.Poste;
    tu ecris "as max" cela signifie que la requete aura pour nom de colonne "max".

    donc ton datareader connaitra max comme nom de colonne a mon avis...
    Le " as MAX " ne pose aucun problème. Ce qui viens après le AS est interpréter comme un alias.
    Life myLife = new Life ("eat","sleep","code");

  10. #10
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Je m'enfonce dans mon explication donc j espere ne pas dire de betise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX (ID_poste) AS maxIdPoste FROM dbo.Poste;
    va donner :

    |maxIdPoste |
    -------------
    | 45645454 |


    ton datareader va pouvoir lire cette colonne si tu lui donnes le bon nom de colonne "maxIdPoste":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mySqDataReader["maxIdPoste"] != System.DBNull.Value)

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Arthis Voir le message
    Je m'enfonce dans mon explication donc j espere ne pas dire de betise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX (ID_poste) AS maxIdPoste FROM dbo.Poste;
    va donner :

    |maxIdPoste |
    -------------
    | 45645454 |


    ton datareader va pouvoir lire cette colonne si tu lui donnes le bon nom de colonne "maxIdPoste":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mySqDataReader["maxIdPoste"] != System.DBNull.Value)
    Ah oui bien sur en passant le nom de la colonne directement, cela ne pourra pas marcher.

    La solution comme tu la bien dit est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       while (mySqDataReader.Read())
                {
                    if (mySqDataReader["MAX"] != System.DBNull.Value)
                    {
                        id_poste = (Int32)mySqDataReader["MAX"];
                    }
     
                }
    Avec le code que j'ai montré plus haut, le problème ne peut être posé car j’utilise index de la colonne

    CE qui donnerai avec le if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       while (mySqDataReader.Read())
                {
                    if (mySqDataReader[0] != System.DBNull.Value)
                    {
                        id_poste = (Int32)mySqDataReader[0];
                    }
     
                }
    Life myLife = new Life ("eat","sleep","code");

  12. #12
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Italie

    Informations forums :
    Inscription : octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    a titre de conseil en passant, évite de passer par les index des colonnes. déjà qu'utiliser un datareader c'est pas super bien, d’écrire le nom des colonnes directement comme ca, c'est pas le top non plus, mais jouer avec l'index des colonnes c'est l'enfer assuré...

  13. #13
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Je suis entièrement d'accord avec toi Arthis, cela peut être contraignant si l'on doit rajouter une colonne.

    Lors de début de projet, je m'efforce de définir l'ensemble des contraintes liés a la BD, je créer ainsi mes tables et mes colonnes la plupart du temps de manière définitive.

    Cela donc me permet d'utiliser les index de colonnes dans mes fonctions d'appel aux données.

    Mais encore une fois sur le principe je suis totalement d'accord avec toi et rien que pour ça, sa mérite un vote positif
    Life myLife = new Life ("eat","sleep","code");

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par benny-blanco Voir le message
    Le " as MAX " ne pose aucun problème. Ce qui viens après le AS est interpréter comme un alias.
    Merci pour ton avis Arthis, c'est effectivement sa. Il suffisait de remplacer ID_Poste par max.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (mySqDataReader["max"] != System.DBNull.Value)
                        {
                            id_poste = (Int32)mySqDataReader["max"];
                        }
    Merci a vous tous pour votre aide. =)

    Le problème est résolu.

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

Discussions similaires

  1. [PDO] Connexion avec la Base de Données avec PDO
    Par chipmunkette dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/05/2013, 20h58
  2. Réponses: 2
    Dernier message: 25/05/2011, 16h36
  3. Réponses: 4
    Dernier message: 05/10/2009, 13h19

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