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 :

PreparedStatement/ResultSet qui "foire"


Sujet :

JDBC Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut PreparedStatement/ResultSet qui "foire"
    Voila je vous explique mon problème, j'ai une fonction qui me renvoi un PreparedStatement :

    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
    public PreparedStatement getLogin(Integer pMatricule, String pPassword) {
    		PreparedStatement vLogin = null;
     
    		try {
    			vLogin = mConnection.prepareStatement(
    					"SELECT matricule FROM l_sps " +
    					"WHERE matricule = ? AND password = MD5(?);");
     
    			vLogin.setInt(1, pMatricule);
    			vLogin.setString(2, pPassword);
    		} catch (SQLException e) {
    			vLogin = null;
    			e.printStackTrace();
    		}
     
    		// Voir trace d'execution suivante
    		System.out.println(vLogin);
     
    		return vLogin;
    	}
    >>> com.mysql.jdbc.JDBC4PreparedStatement@efd552: SELECT matricule FROM l_sps WHERE matricule = le_bon_matricule AND password = MD5('le_bon_pass');

    J'ai donc ma fonction qui marche et qui me renvoi ce qu'il faut...

    Associée à ceci, j'ai une fonction qui permet de traiter ce PreparedStatement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Integer login(Integer pMatricule, String pPassword) {
    		try {
    			ResultSet vResult = executeQuery(mRequests.getLogin(pMatricule, pPassword));
     
    			if (vResult.getFetchSize() == 0)
    				return null;
    			else
    				return vResult.getInt(1);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
     
    		return null;
    	}
    et enfin, un appel à cette fonction dans mon IHM :

    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
    private JButton getConnect() {
    		if (mLogin == null) {
    			mLogin = new JButton("Connexion");
    			mLogin.addActionListener(new ActionListener() {
    				@Override
    				public void actionPerformed(ActionEvent e) {
    					String vPass = "";
    					for (int i = 0; i < mPassword.getPassword().length; i++)
    						vPass += mPassword.getPassword()[i];
     
    					// Voir la trace d'execution suivante
    					System.out.println(mIHM.getDB().login(
    							Integer.parseInt(mMatricule.getText()), 
    							vPass));
    					mIHM.restart();
    				}
    			});
    		}
    		return mLogin;
    	}
    >>> null

    J'en déduit donc que le ResultSet est vide (j'ai fait un affichage de FetchSize et j'ai bien 0)


    Le problème c'est que si je récupère la requète contenu dans le PreparedStatement (cf. 1ère trace) et que je l'exécute directement (phpmyadmin par exemple) j'ai bel et bien un résultat...

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Avant tout, peux-tu nous dire:

    - c'est quoi mRequests dans la fonction login?

    - la relation entre mIHM.getDB().login et mRequests ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    - mRequests est une instance de la classe contenant la fonction getLogin (j'ai exporté la totalité de mes requêtes dans cette classe en fait).

    - mIHM.getDB().login exécute la requête renvoyée par getLogin (fonction contenu dans mRequests)

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    - voir ceci pour l'utilisation de getFetchSize
    http://www.java2s.com/Code/JavaAPI/j...tFetchSize.htm


    - Une chose a faire quand tu utilises API jdbc (ResultSet, Statement, PreparedStatement, Connection ....) il faut faire une close a la fin quand tu n'as plus besoin d'eux.

    Par exemple
    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
     
        public static Object getObject(Integer pMatricule, String pPassword)
        {
     
            List<Object> result = new LinkedList<Object>();
            PreparedStatement vLogin = null;
            ResultSet rs = null;
            try {
                vLogin= connection.prepareStatement(
    	          "SELECT matricule FROM l_sps " +
    	          "WHERE matricule = ? AND password = MD5(?);");
     
    			vLogin.setInt(1, pMatricule);
    			vLogin.setString(2, pPassword);
     
                rs = vLogin.executeQuery();
                if (rs != null) {
                    while (rs.next()) {
                        result.add(rs.getInt(1));
                    }
                }
            } catch (Exception e) {                          
                result = null;
            }
            finally {
                try {
                    rs.close();
                } catch (Exception e) {
                }
                try {
                    vLogin .close();
                } catch (Exception e) {
                }
            }
            return result;
        }
    Je ne suis pas sure que getFetchSize peut donner le resultat. J'utilise le rs.next() pour l'obtenir

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    fetchSize, c'est un indicateur sur par bloc de combien de row le driver doit récupérer les données de la DB, ca n'a rien à voir avec le nombre de row retournés par ta requete! Pour savoir si tu as au moins un row dans ta requete, utiliser if (resultSet.next()).

    De plus, toujours mettre un bloc finally pour fermer le preparedStatement:
    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
    public Integer login(Integer pMatricule, String pPassword) {
                    PreparedStatement st = null;
    		try {
                            PreparedStatement st = mRequests.getLogin(pMatricule, pPassword);
    			ResultSet vResult = executeQuery(st);			
    			if (vResult.next())
    				return vResult.getInt(1);
    			else
    				return null;
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
                             if (st!=null)
                                   st.close();
                    } 
     
    		return null;
    	}

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 8
    Points
    8
    Par défaut
    Ah merci beaucoup les mecs! Le problème venait bien du getFetchSize(), je sais pas ou j'suis allé pêcher ça...

    Je ferme effectivement ma connection quand il le faut et j'ai ajouté la fermeture des ResultSet. En revanche pour les PreparedStatement ça bloque (j'utilise une fonction que j'ai créé) :

    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
    public ResultSet executeQuery(PreparedStatement pStatement) {
    		try {
    			return pStatement.executeQuery();
    		} catch (SQLException e) {
    			e.printStackTrace();
    			return null;
    		} /*finally {
    			if (pStatement != null)
    				try {
    					pStatement.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    		}*/
    	}
    En laissant le bloc finally j'obtient :
    >>> java.sql.SQLException: Operation not allowed after ResultSet closed


    La fermeture d'un PreparedStatement entraine la fermeture des ResultSet associés?

Discussions similaires

  1. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03

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