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 :

comparer les résultats d'une requete sql


Sujet :

JDBC Java

  1. #1
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut comparer les résultats d'une requete sql
    bonjour à tous!!

    j'aimerai comparer les resultats d'une requete SQL avec des elements provenant de plusieurs JTextField

    par exemple
    j'ai un JTextField "nomm" et "prenomm"
    et ma requete est : SELECT nom, prenom FROM membres";

    donc j'aimerai comparer nomm avec nom et prenomm avec prenom

    si quelqu'un pouvait m'aider, se serait vraiment tres sympa car là j'ai aucune idée, aucune piste..

    merci

  2. #2
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Il y a apparement plusieurs problème. Pour ce qui est d'exécuter ta requête SQL je t'invite à faire un tour sur la FAQ JDBC et tu trouvera comment faire un requete et en récupérer les résultats.
    Pour ce qui est du JTextField la méthode getText permet de récupérer le texte qu'il contient.
    Pour ce qui est de la comparaison entre les 2 chaines tu dois faire attention à utiliser la méthode equals (et non pas ==).
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  3. #3
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    pour tout ce qui concerne la requete et le getText() je connais et j'ai fait
    j'ai tout simplement pas voulu mettre tout le code, car je n'ai pas trouver cela necessaire

    en regardant la FAQ, j'ai trouvé ce que je cherchais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ResultSet resultat = statement.executeQuery(sql);
    while(resultat.next()){
     
    ==> c'estcela que je cherchais
    int id = resultat.getInt(1);
    String nom = resultat.getString(2);
    double prix = resultat.getDouble(3);

  4. #4
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    bon finalement je crois qu'il y a un soucis

    normalement lorsque l'on boucle sur els résultats de la requete et qu'on veux les recuperer, il devrait apparaitre l'ensemble des resultats et non pas le 1er enregistrements
    j'ai fait, comme dans la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while(res.next())
    				{
     
     
     
     
    String heureReq = res.getString(1);
    System.out.println(heureReq);
     
    String dateReq = res.getString(2);
    System.out.println(dateReq);
    suis peut être à coté de la plaque

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Effectivement le while(rs.next()) boucle sur tous les enregistrements.

    Si tu ne rentres qu'une seule fois dans la boucle, c'est que ta requête SQL ne retourne qu'un seul enregistrement.

  6. #6
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    donc il faut que je boucle avec un for dans la boucle while ?

  7. #7
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par oceane751 Voir le message
    donc il faut que je boucle avec un for dans la boucle while ?

  8. #8
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    poste ton code,
    juste en fesant un while(rst.next()) tu parcours ligne par lignes tes enregistrements.

  9. #9
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    ba oui je sais c'est ridicule mais franchement je comprends paspourquoi avec une boucle ça ne boucle pas

    Citation Envoyé par DevTeam_ Voir le message

  10. #10
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    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
     
    public void actionPerformed(ActionEvent e) 
    	  {
    		if (e.getSource() == but)
    		{
    		Fonction fonc = new Fonction();
    		String requetee = "SELECT heure, date_rdv FROM membres ";
    		ResultSet res = fonc.Conec(requetee);
     
    			try {
    				while(res.next())
    				{
     
     
    				String heureReq = res.getString(1);
    				System.out.println(heureReq);
    				String dateReq = res.getString(2);
    				System.out.println(dateReq);
     
     
    .........

  11. #11
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    pour moi si tu n'as qu'une ligne de résultat c'est que ta requete ne renvoi qu'une seule ligne. Essaye de la jouer directement sur ta base pour vérifier.
    Si elle te renvoi plus d'une ligne donne nous le code de ta classe Fonction pour voir ce que fait la méthode Conec.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  12. #12
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    oui oui il y a plein d'enregistrements dans ma bdd

    alors ma classe Fonction
    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
     
    public class Fonction   {
     
     
    	public Fonction()
    	{
     
    	}
     
     
    public ResultSet Conec (String requet)
     
    	{
     
    		String pilote = "com.mysql.jdbc.Driver";
     
    		try{
     
    		Class.forName(pilote);
    		Connection connexion = DriverManager.getConnection("jdbc:mysql://localhost/membre","jo","oui");
    		Statement instruction = connexion.createStatement();
    		ResultSet resultat = instruction.executeQuery(requet);
    		return resultat;
     
    		}
    		catch (Exception e){
     
    			System.out.println("echec pilote : "+e);
    		}
    		return null;
     
    	}
    }

  13. #13
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par oceane751 Voir le message
    ba oui je sais c'est ridicule mais franchement je comprends paspourquoi avec une boucle ça ne boucle pas
    J'abonde dans le sens de guigui5931, essaie d'exécuter ta requête directement sur ta base de données...

    Poste également la suite de ta boucle while, des fois que tu aies mis une instruction qui vrille le resultset

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Vu que tu crées ta connection dans une autre méthode et que tu ne la donne pas en retour, j'ai bien peur qu'elle soit automatiquement fermée derrière .

    A chaque fois c'est le même problème, donc je répète que le code permettant d'exécuter une requête SQL doit TOUJOURS être de la forme suivante :

    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
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try
    {
        conn = DriverManager.getConnection(..., ..., ...);
        stmt = conn.createStatement();
        rs = stmt.executeQuery(...);
        while (rs.next()) { ... }
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }
    finally
    {
        if (rs != null)
            try{rs.close();} catch(SQLException e){}
        if (stmt != null)
            try{stmt.close();} catch(SQLException e){}
        if (conn != null)
            try{conn.close();} catch(SQLException e){}
    }
    Un des moyens que j'ai trouvé pour "capitaliser" du code est de faire un truc comme ça :

    Interface pour remplir les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    interface ResultMap<T> {
        public T fill(ResultSet rs) throws SQLException;
    }
    Bean représentant le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class BeanRes
    {
        private String heure;
        private String date;
        public BeanRes() {}
        // GET/SET
    }
    Gestion de la connection/requêtes :
    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
    class DAOManager
    {
        void executeQuery(String sql, ResultMap rm)
        {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            try
            {
                conn = DriverManager.getConnection(..., ..., ...);
                stmt = conn.createStatement();
                rs = stmt.executeQuery(...);
                while (rs.next()) {
                    rm.fill(rs);
                }
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (rs != null)
                    try{rs.close();} catch(SQLException e){}
                if (stmt != null)
                    try{stmt.close();} catch(SQLException e){}
                if (conn != null)
                    try{conn.close();} catch(SQLException e){}
            }
        }
    }
    Exemple main/exécution d'une requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Collection<BeanRes> results = 
        DAOManager.getInstance().executeQuery(
            "SELECT heure, date_rdv FROM membres",
            new ResultMap<BeanRes>(){
        public BeanRes fill(ResultSet rs)
            throws SQLException
        {
            BeanRes br = new BeanRes();
            br.setDate(rs.getString(1)); 
            br.setHeure(rs.getString(2));
            return br;
        }
    });
    L'étape suivante consiste à faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Collection<BeanRes> result =
        DAOManager.getInstance().executeQuery(
            "SELECT heure, date_rdv FROM membres", BeanRes.class);
    Mais après celà veut dire qu'il faut passer à hibernate dans ce cas

  15. #15
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Totalement d'accord sur le probleme de structuration du code, mais pour son souci, je ne pense pas que la connexion soit la cause puisqu'elle parvient à récupérer 1 enreg ! Si la connexion était fermée en sortie de méthode, le 1er res.next() lèverait une exception non ?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Le connexion n'est peut-être pas fermée immédiatement.

    Il me semble qu'elle peut se fermer au passage du garbage collector sur le finalize(), ou avec un timeout si elle n'est pas appelée genre pendant 10 sec...

    Celà est du au fait que les 3/4 des développeurs ne ferment jamais leurs connexions explicitement avec conn.close()...

    Ca dépend aussi certainement des implémentations fournies par les SGBD...

    Mais tu as raison, une exception serait certainement levée dans ce cas.

    En réalité, je pense tout simplement que sa requête renvoi un seul record

    Mais je voulais juste au passage revenir sur la syntaxe parce que je m'apperçoit que beaucoup cherchent à capitaliser du code à fond sur l'exécution d'une requête SQL et que généralement ça donne du grand nimporte quoi

  17. #17
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Dans le cas d'oceane, je ne pense pas que la connexion puisse être garbagée puisque le resutlset référence son statement, qui lui référence cette connexion... Mais dans l'absolu, tu as surement raison.

    Citation Envoyé par Duc Lebowski Voir le message
    En réalité, je pense tout simplement que sa requête renvoi un seul record

    Mais je voulais juste au passage revenir sur la syntaxe parce que je m'apperçoit que beaucoup cherchent à capitaliser du code à fond sur l'exécution d'une requête SQL et que généralement ça donne du grand nimporte quoi
    Je plussoie avec vigueur !

  18. #18
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    oui mais comment se fait il qu'avec ce code :
    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
     
    Fonction fl = new Fonction();
    		String re = "SELECT nom, heure FROM membres WHERE date_rdv="+"\""+datee+"\"";
    		ResultSet y = fl.Conec(re);
     
    		try {
    			while( y.next())
    			{
    				String nom =  y.getString("nom");
    				String heure = y.getString("heure");
     
     
    		listeItems.addElement("RDV avec "+nom+  " " + "à" +heure);
     
    			}
    		} catch (SQLException e)
    		{
    		    e.printStackTrace();
    		}
    ça me renvoit tous les resultats ? alors que c'est pratiquement le meme code

  19. #19
    Membre confirmé Avatar de oceane751
    Profil pro
    Intégrateur Web
    Inscrit en
    Novembre 2004
    Messages
    1 280
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 280
    Points : 575
    Points
    575
    Par défaut
    je vous mets le bout de code en entier
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    public void actionPerformed(ActionEvent e) 
    	  {
    		if (e.getSource() == but)
    		{
    			Fonction fonc = new Fonction();
    			String requetee = "SELECT heure, date_rdv FROM membres ";
    			ResultSet res = fonc.Conec(requetee);
     
    			try {
    				while(res.next())
    				{
    					String heureReq = res.getString("heure");
    					System.out.println(heureReq);
    					String dateReq = res.getString("date_rdv");
    					System.out.println(dateReq);
     
     
     
     
     
     
    					if ( (heureReq == textheure.getText()) && (dateReq == textdate.getText()) )
    					{	
     
    						JOptionPane.showMessageDialog(null, "dejà une RDV pour cette heure","deja une RDV pour cette heure", JOptionPane.NO_OPTION );
    						break;
     
     
     
     
    					}
    					else
    					{
    						String requete = "INSERT INTO membres (nom, heure, date_rdv) VALUES('"+textnom.getText()+"', '"+textheure.getText()+"', '"+textdate.getText()+"')";   
    						//System.out.print(requete);
     
    						Fonction foncc = new Fonction();
    						int y = foncc.maj(requete);
     
    						if (y != 0)
    						{
    							Disposition dispo = new Disposition();
    							dispo.setVisible(true);
    							setVisible(false);
    							JOptionPane.showMessageDialog(null, "insertion bien effectuéé","insertion bien effectuéé", JOptionPane.OK_OPTION ); 
    						break;
    						}
    					}
    				}
    			}
     
     
     
     
    			catch (SQLException e1) 
    			{
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
     
     
     
    		} 
    }
    en faite en fonction de l'heure et de la date entrées, je verifie si pour une date donnée, dans la bdd, il n'y a pas dejà un rdv pour l'heure voulue
    dans ce cas, la requete d'insertion ne se fera pas.

    c'est sur la 1ere requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String requetee = "SELECT heure, date_rdv FROM membres ";
    que pose le problème, cad que je n'arrive pas à "sortir" tous les resultats afin de faire les comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ( (heureReq == textheure.getText()) && (dateReq == textdate.getText()) )

  20. #20
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Le break que tu as mis dans ton code te fera sortir de ta boucle while, donc si, dans ton exemple, tu arrives à faire ta mise à jour (y != 0), alors tu va passer dans le break, et c'est pour ça que tu dis n'avoir qu'1 seul enregistrement retourné...

    D'où l'importance de bien mettre tout son code avant de mettre des phrases du genre "ça me renvoit tous les resultats ? alors que c'est pratiquement le meme code" et d'utiliser le smiley , ça pourrait exaspérer les personnes de ce forum qui passent du temps à t'aider.

    Enfin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    heureReq == textheure.getText()
    ça ne marchera jamais....... Va faire un tour sur le tutoriel "Développons en Java (La syntaxe et les éléments de bases de Java)" :
    http://jmdoudoux.developpez.com/java...e_java#L3.10.3

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/08/2009, 21h14
  2. Réponses: 4
    Dernier message: 02/06/2009, 14h57
  3. Comment récupérer les résultats d'une requete SQL?
    Par verbal34 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 13/02/2008, 09h17
  4. [SQL] Comment je peux mettre les résultat d'une requete dans un fichier
    Par Maria1505 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 10/12/2006, 21h44
  5. Mettre a jour les Parametres dans une requete SQL
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 7
    Dernier message: 31/03/2004, 13h51

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