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 :

[JDBC] Mon résultat me retourne toujours null


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Par défaut [JDBC] Mon résultat me retourne toujours null
    Bonjour,

    J’exécute une requête vérifiant l’existence de données, et le résultat de la fonction me retourne toujours "false" même les fois où il devrait me retourner "true", ainsi je vais vous montrer mon code parce que je ne troue pas l'erreur:

    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
     
    	public boolean rechercheSportifExiste(String nom, String prenom)
    	{
    		boolean verifSportifExiste = false;
    		try{    
    			stmt = (Statement) Connexion().createStatement();  
    			String sql = "SELECT * FROM sportif" +
    		                 " WHERE nom LIKE \""+ nom +"\" " +
    		                 "AND prenom LIKE \""+ prenom+"\" ";
    			System.out.println(sql);
    		    ResultSet result = stmt.executeQuery(sql);
     
    		    verifSportifExiste = result.wasNull();
    		    //return verifSportifExiste;
     
    		    System.out.println(result.wasNull());
     
    		   }
    		catch(SQLException se)
    		{
    		      //Handle errors for JDBC
    		      se.printStackTrace();
    		}
    		catch(Exception e)
    		{
    			//Handle errors for Class.forName
    			e.printStackTrace();
    		}
    	    return verifSportifExiste;
    	}
     
    	public static void main(String[] args) {
    		Connect connn = new Connect();
    		System.out.println(connn.rechercheSportifExiste("Collery","Adrien")); 
    	}
    Merci pour votre future aide.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Désolé mais y'a plein d'erreur dans ton code...

    • Les Statement/ResultSet doivent être libéré proprement après l'utilisation, soit en appelant close(), soit via un try-with-ressource de Java 7.
    • Même chose pour la Connexion... selon comment tu la gères...
      De plus "Connexion()" est une méthode et devrait débuter par une minuscule !!!
    • "stmt" est une variable locale, alors pourquoi n'est-elle pas déclarée dans la méthode ?
    • La gestion des exceptions est crade. Si tu ne sais pas quoi faire laisse la remonter dans une RuntimeException...
    • Enfin wasNull() s'utilise après un get sur un champs... Mais pour lire le contenu du ResultSet il faut utiliser next() !



    Bref ta méthode devrait plutôt ressembler à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public boolean rechercheSportifExiste(String nom, String prenom) {
    		String sql = "SELECT * FROM sportif" +
    		                 " WHERE nom LIKE \""+ nom +"\" " +
    		                 "AND prenom LIKE \""+ prenom+"\" ";
    		try (Statement stmt = Connexion().createStatement();
    		  ResultSet result = stmt.executeQuery(sql)) {
    			return result.find();
    		} catch(SQLException se) {
    			throw new RuntimeException(e);
    		}
    	}

    a++

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Par défaut
    Merci pour votre aide.

    Je ne comprends pas ce que fait la fonction find(), pouvez vous me l'expliquer svp, merci.
    Et comment je voudrais utiliser mon wasNull() afin de savoir si la requête renvoie quelque chose svp

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    find() recherche l'élément suivant dans le ResultSet.
    C'est obligatoire de l’appeler au moins une fois pour accéder à la première ligne retournée.


    wasNull() ne peut pas s'appliquer sur une ligne, mais uniquement sur un champ. Il faut donc appeler une des méthodes getXXX() avant.
    Et encore wasNull() est surtout utile pour les types primitifs (getDouble()/getInt()/getFloat()...) car les autres peuvent renvoyer directement un null...


    a++

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    find() n'existe pas dans l'interface ResultSet. Pour savoir si ta requête a des enregistrement, il suffit de faire return result.next(); à la place de return result.find();. wasNull() c'est pour savoir si la dernière colonne lue a retourné une valeur null : aussi faut-il qu'il y ait au moins un enregistrement dans le resultSet et qu'on y ait lu au moins une colonnne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while( result.next() ) {
        result.getObject(1);
        if ( result.wasNull() ) {
            /* ... */
        }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    find() n'existe pas dans l'interface ResultSet.
    My bad ! J'ai encore confondu

    Je voulais bien parler de next() ou first()... mon clavier a fourché !


    a++

  7. #7
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Attention à first() aussi, il ne faut pas que le ResultSet soit de type FORWARD_ONLY (sinon paf le chien), donc pas avec ResultSet par défaut.


    Sinon, le pourquoi du wasNull : quand on récupère une valeur primitive avec un ResultSet (getBoolean, getLong, getInt ...), on récupère des types primitifs.

    Par exemple :
    int myInt = rs.getInt("ID");
    Si la colonne ID était NULL, la valeur de myInt sera... 0 ! Puisque la valeur par défaut d'un int est 0.

    Du coup, il est nécessaire de vérifier si les valeurs récupérées sont NULL ou pas, avant que l'exécution ne leur affecte une valeur par défaut qui ne sera pas correcte.

  8. #8
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    wasNull() est une fonction qui s'utilise APRES avoir tenté de récupérer une valeur

    Par exemple, tu as une table avec les champs suivants :

    ID - NOM - PRENOM

    Tu fais ta requête : "select * from myTable where id = 455"

    Puis tu récupères tes résultats
    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
     
    try (Statement stmt = Connexion().createStatement();
    		  ResultSet result = stmt.executeQuery(sql)) {
    		while (result.next()){ // on boucle sur toutes les "lignes" de resultat
    			// si on rentre dans la boucle, c'est qu'il existe des données en base
    			Long id = result.getLong("ID"); // on récupère la valeur du champ ID
    			if (result.wasNull()){ // Ici, on regarde si le résultat renvoyé correspond à la valeur null en base
    				System.out.println("ID null"); // dans notre exemple, on a demandé un ID donc ça ne peut pas arriver
    			}
    			String prenom = result.getString("Prenom");
    			if (result.wasNull()){ // Ici, on regarde si le résultat renvoyé correspond à la valeur null en base
    				System.out.println("prenom null"); 
    			}	
    			....
    		}
    	} catch(SQLException se) {
    		// gérer l'exception proprement sans la renvoyer dans une runtime
    	}
    Pour vérifier le nombre de lignes renvoyées par une requête : deux solution
    - faire un count(*) et récupérer le nombre renvoyé
    - faire ta requete normale en utilisant un ResultSet Scrollable (attention, pas dispo sur tous les drivers JDBC), se positionner sur le dernier élément (last()) et demander le rang (getRow())

    Pour la deuxième solution, tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Statement stm = myConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/06/2011, 19h58
  2. ma fonction retourne toujours null
    Par haco28 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 13/08/2009, 11h53
  3. [AJAX] mon retour XML est toujours NULL
    Par beegees dans le forum AJAX
    Réponses: 1
    Dernier message: 14/04/2009, 07h22
  4. [PB9] En exécutable, ImportFile retourne toujours NULL
    Par a_zoubir dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 20/12/2008, 19h02
  5. Réponses: 2
    Dernier message: 30/03/2006, 16h18

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