Un bug étrange

Résolu
baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008 - 17 mai 2008 à 22:46
baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008 - 18 mai 2008 à 21:20
Bonsoir,

Je récupère deux strings d'une boite de dialogue, un pseudo et un Mdp, pour vérifier l'authentification à une base de données.
Ma requette SQL s'execute normalement, je localise bien les données souhaitées.

Jusque là pas de probleme sauf qu'après j'affiche l'enregistrement complet dans une table et celui-çi est vide....

Lorsque je debogue et que je m'arrete sur la ligne de code en vert resultat.next() est égal à true, je fais un pas et j'arrive dans la ligne orange. ??
En cours de route mon resultat a changé !

Si je mets la condition en commentaire cela fonctionne bien pour l'affichage de mes infos...

Etrange non ? Je vois pas en quoi un simple test vient perturber le bon fonctionnement du programme...

Voiçi les quelques lignes de code :

Statement instruction = Dia.Fen.connexion.createStatement();                        sql "SELECT * FROM data where pseudo "" + pseudo + "" and mdp = "" + mdp + """ ;
           
                        ResultSet resultat = instruction.executeQuery(sql);
           
                        if (resultat.next()==true)
                        {
                            Dia.setVisible(false) ;
                            JOptionPane.showMessageDialog(null, "Identification réussi\n Bienvenue "+ resultat.getString("prenom")+" "+resultat.getString("nom") , "Data connect", JOptionPane.INFORMATION_MESSAGE);
                        }
                        else
                        {
                            JOptionPane.showMessageDialog(null, "Echec d'autentification" , "Data connect", JOptionPane.ERROR_MESSAGE);   
                        }
                         ResultSetTableModel tableModel = new ResultSetTableModel();
                         tableModel.updateModel(resultat);
                         Dia.Fen.table = new JTable(tableModel);
                         if (Dia.Fen.JSP!= null) Dia.Fen.getContentPane().remove(Dia.Fen.JSP);
                         Dia.Fen.JSP = new JScrollPane(Dia.Fen.table);
                         Dia.Fen.getContentPane().add(Dia.Fen.JSP,BorderLayout.CENTER);
                         Dia.Fen.validate();

5 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
18 mai 2008 à 20:40
Si ton débogueur te permet d'appeler des méthodes (ce qui est sans doute le cas, sinon comment connaitrais tu la valeur?), oui.
Ca me semble logique. Par exemple, si dans un débogueur tu visualises la valeur de i++, ca va changer la valeur de i.

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008
18 mai 2008 à 10:51
Arf ! J'ai cherché mais je ne comprends pas.

Est-ce normal qu'un simple test if (resultat.next()==true) modifie la valeur de mon ResultSet

Je suis revenu en arrière sur le code mais pas moyen d'éviter le phénomène.
Le plus étrange c'est que je n'obtiens pas les mêmes résultats si je debogue ou non.
Pour m'en sortir j'execute deux fois ma query en rouge ?

Avez-vous une idée ?

                        ResultSet resultat = instruction.executeQuery(sql);
           
                        if (resultat.next()==true)
                        {
                            Dia.setVisible(false) ;
                           
JOptionPane.showMessageDialog(null, "Identification réussi\n Bienvenue
"+ resultat.getString("prenom")+" "+resultat.getString("nom") , "Data
connect", JOptionPane.INFORMATION_MESSAGE);
                        }
                        else
                        {
                           JOptionPane.showMessageDialog(null, "Echec d'autentification" , "Data connect", JOptionPane.ERROR_MESSAGE);   
                        }

                         resultat = instruction.executeQuery(sql);
                         ResultSetTableModel tableModel = new ResultSetTableModel();
                         tableModel.updateModel(resultat);
                         Dia.Fen.table = new JTable(tableModel);
                         if (Dia.Fen.JSP!= null) Dia.Fen.getContentPane().remove(Dia.Fen.JSP);
                         Dia.Fen.JSP = new JScrollPane(Dia.Fen.table);
                         Dia.Fen.getContentPane().add(Dia.Fen.JSP,BorderLayout.CENTER);
                         Dia.Fen.validate();
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
18 mai 2008 à 19:48
Le fait d'appeler la méthode next() modifie la position du curseur dans ton ResultSet. Tu n'aura donc pas la même comportement si tu appelles une ou deux fois cette méthode.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008
18 mai 2008 à 20:31
Que je comprennes bien. Est-ce à dire que lorsque je m'arrete sur ma condition : if (resultat.next()==true) que je visualise la valeur en debogant, le fait ensuite de l'executer me renvoie false parce que je n'ai effectivement qu'un seul enregistrement ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008
18 mai 2008 à 21:20
Hé ben ! Merci, je reprends la programmation (j'ai arrêté en 98 avec Borland C++) et je me suis fait piéger par le progrès...
0
Rejoignez-nous