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

JDBC Java Discussion :

[Débutant] Problème d'utilisation d'un ResultSet


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Débutant] Problème d'utilisation d'un ResultSet
    Bonjour, je vous écris car j'ai un problème que je n'arrive pas à résoudre.
    Je suis nouveau dans le langage de la programmation c'est pourquoi je vous demande d'être indulgent si mon problème est relativement facile pour certain ^^

    Donc voila, mon problème est que je récupère les données de ma base de données Mysql via un ResultSet. Jusque là tout marche, j'arrive à bien lister les infos que je veux dans l'IDE Eclipse.

    Je souhaiterai cependant afficher ces résultats dans une fenêtre ou il y aurait plusieurs champs en textfield qui se remplieraient avec les informations reçues. Jusque là j'y arrive cependant étant donné que j'ai plusieurs entrées, par exemple dans "id" ou bien "nom_utilisateur", j'utilise:



    String sql ;
    sql = "select name from ma_table";
    ResultSet resultat;

    while(resultat.next()){

    mon_champ_texte.setText(resultat.getString(1))

    }


    Mon problème est donc que l'opération s'effectue bien, seulement a la fin de l'opération je n'ai finalement que la dernière entrée de la liste qui apparait puisque tant qu'il y a un résultat il change le mon_champ_texte par le prochain élément de la liste.

    Je voudrais pouvoir afficher le premier élément, ensuite grâce à un bouton bouton_next par exemple, faire bouger jusqu'à la seconde entrée et ainsi de suite. L'interet est d'afficher 1 à 1 toutes les entrées, chose que je n'arrive pas à faire avec resultat.next().

    J'ai bien essayé resultat.first et last mais mes compétences sont assez limitées...


    Merci de m'avoir lu et j'espère que vous connaissez bien ce problème de débutant.

    Amicalement, Oulanos

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Salut,

    Tu dois récupérer tes informations sous la forme d'une collection d'informations, et ensuite boucler sur celles-ci.

    Normalement, le parcours d'un ResultSet se fait dans la partie "dao" de ton architecture. Cette partie, remplie une Collection ( du type de ton choix, par exemple un ArrayList d'objets ) et cette collection est utilisée dans ta vue.

    Quel est la technologie que tu utilises pour afficher les champs ? JSP ?

    A+

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Salut,

    Tu dois récupérer tes informations sous la forme d'une collection d'informations, et ensuite boucler sur celles-ci.

    Normalement, le parcours d'un ResultSet se fait dans la partie "dao" de ton architecture. Cette partie, remplie une Collection ( du type de ton choix, par exemple un ArrayList d'objets ) et cette collection est utilisée dans ta vue.

    Quel est la technologie que tu utilises pour afficher les champs ? JSP ?

    A+
    merci d'avoir répondu aussi vite!

    oula que de mots compliqués ^^.. collection d'informations? donc ce que vous pensez c'est qu'il faut que je fasse un tableau avec mon resultset et que je fasse une boucle? cependant ce n'est pas ce que je fais avec un resultat.next() déja? il boucle dans le resultset jusqu'a ce qu'il n'y ait plus d'entrées, mon problème est qu'il les récupère TOUTES et pas une par une en fait.


    "Quel est la technologie que tu utilises pour afficher les champs ? JSP ?"
    Jsp c'est Java Server Pages non? je n'utilise pas mon appli comme applet ou sur le web, c'est juste en local.

    Désolé si j'ai répondu à coté mais je ne suis que débutant ^^

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    En fait la solution qui t'est proposée consiste à parcourir ton resultset (comme tu le fais) et, au lieu de renseigner ton textField de remplir une collection (ArrayList par exemple).

    C'est ensuite cette collection que tu utilise pour remplir ton textField. Ca sera beaucoup plus simple pour faire des next/previous et en plus ça ne t'oblige pas à rester connecter à ta base. De plus, tu devrais créer une classe qui représente l'objet que tu affiche. Ca sera plus propre et surtout plus générique ...

    si tu as correctement cloisonnée ton appli, tu dois avoir une partie qui gère la récupération des infos depuis la base et une autre qui s'occupe de l'affichage des valeurs. enfin c'est la solution vers laquelle tu dois tendre.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Salut !

    Je crois avoir saisi ce que tu cherches...
    Tout d'abord il faut que tu transfères ton ResultSet dans une collection ( terme désignant un group de données, comme une ArrayList par exemple ).
    Voici le code te permettant de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ArrayList liste = new ArrayList();
     
    while( resultat.next() )
         liste.add( resultat.getString(1) );
    Une fois fait, il ne te reste plus qu'à afficher les éléments que tu veux en les récupérant via un index.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int index = 0;
     
    (String) liste.get( index );
    Et à chaque fois que tu appuieras sur ton bouton next, tu incrémenteras ton index...

    Ai-je bien répondu à ta question ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci, super c'est exactement ce que je cherchais, mais je comprenais pas le terme (collection), avec l'exemple ça passe tout seul ^^


    Merci encore je vais essayer comme ça, et désolé de vous avoir dérangé.


    Amicalement, Oulanos

  7. #7
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Il faut séparer la logique d'affichage ( la vue ) et la logique métier / persistence ( le "modèle" ).

    Imaginons ceci :

    une classe A d'affichage, avec une méthode printListeChamps() par exemple, affiche les éléments souhaités. Cette méthode, prend en paramètre un ArrayList ( c'est un objet Java qui fonctionne comme un tableau, mais dont la taille peut varier ) et à partir de cet ArrayList, affiche les champs dont tu as besoin.

    une classe B de récupération de données, qui avec une méthode getElementsList() retourne un ArrayList avec les données dont tu as besoin ( en utilisant un ResultSet comme tu l'as fait )

    Ta classe d'affichage peut au lancement de son affichage, appeler la méthode printListeChamps() avec en paramètre le ArrayList de ta méthode getElementsList(). Ainsi tu as séparé la vue du modèle. Vois-tu le principe ?

    Dans ta méthode printListeChamps(), voici ce que tu pourrais avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public void printListeChamps(Collection<Element> listeElements) {
        for(Element thisElement : listeElements) {
            // Ici remplir les champs et les ajouter au panel ligne par ligne
        }
    }
    Et donc au démarrage de l'affichage de ta fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class A {
        public A() {
          // Constructeur
          printListeChamps(B.getElementsList());
        }
    }

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Il faut séparer la logique d'affichage ( la vue ) et la logique métier / persistence ( le "modèle" ).

    Imaginons ceci :

    une classe A d'affichage, avec une méthode printListeChamps() par exemple, affiche les éléments souhaités. Cette méthode, prend en paramètre un ArrayList ( c'est un objet Java qui fonctionne comme un tableau, mais dont la taille peut varier ) et à partir de cet ArrayList, affiche les champs dont tu as besoin.

    une classe B de récupération de données, qui avec une méthode getElementsList() retourne un ArrayList avec les données dont tu as besoin ( en utilisant un ResultSet comme tu l'as fait )

    Ta classe d'affichage peut au lancement de son affichage, appeler la méthode printListeChamps() avec en paramètre le ArrayList de ta méthode getElementsList(). Ainsi tu as séparé la vue du modèle. Vois-tu le principe ?

    Dans ta méthode printListeChamps(), voici ce que tu pourrais avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public void printListeChamps(Collection<Element> listeElements) {
        for(Element thisElement : listeElements) {
            // Ici remplir les champs et les ajouter au panel ligne par ligne
        }
    }
    Et donc au démarrage de l'affichage de ta fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class A {
        public A() {
          // Constructeur
          printListeChamps(B.getElementsList());
        }
    }

    d'accord merci ^^ je vais faire comme vous dites, maintenant que j'y réfléchis c'est logique de faire comme ça mais je n'y avait pas du tout pensé.. (ça doit venir avec l'ancienneté et l'entrainement).

    Je vais essayé de faire les choses séparément comme vous dites, merci de votre aide en tout cas, sinon j'aurai pu rester encore un bon moment sur ce problème ^^


    bonne journée

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/01/2008, 14h52
  2. Réponses: 3
    Dernier message: 27/09/2007, 13h55
  3. [débutant]problème à l'utilisation de cin et cout
    Par Damien B. dans le forum SL & STL
    Réponses: 6
    Dernier message: 07/05/2007, 19h23
  4. Réponses: 2
    Dernier message: 05/01/2006, 03h40
  5. [Débutant]Problème d'utilisation package
    Par KJHER dans le forum Langage
    Réponses: 6
    Dernier message: 04/10/2005, 11h59

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