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

avec Java Discussion :

requete insert into qui ne fonctionne pas


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut requete insert into qui ne fonctionne pas
    Bonjour,

    Je me remets doucement à java et impossible de faire fonctionner une "bête " insertion en BDD...
    Je précise que mes données sont récupérées de 2 JTextField d'une fenêtre swing (nom et prénom pour le test).
    Voici ma méthode :
    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
     
    public void addPersonn(Personne p) {
    		PreparedStatement pstmt;
    		String request = PersonneQuery.QUERY_INSERT_PERSONNE;
     
    		try {
    			pstmt = connection.prepareStatement(request);
    			pstmt.setString(1, p.getNom());
    			pstmt.setString(2, p.getPrenom());
     
    			int flag = pstmt.executeUpdate();
    			if (flag >= 1) {
    				System.out.println(flag + "ligne(s) ajoutée(s)");
    				connection.commit();
    			} else {
    				System.out.println("pas d'insertion");
    			}
    			pstmt.close();
     
    		} catch (SQLException e) {
    			e.printStackTrace();
    			ConnexJDBC.rollback();
    		} 
    	}
    voici la pile d'erreur :
    "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException;
    at com.cesi.dao.PersonneDao.addPersonn(PersonneDao.java:17); la ligne 17 correspond à la ligne 7 ici; Je ne comprends pas comment ma référence pstmt est nulle.

    Merci

  2. #2
    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 : 55
    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,

    Citation Envoyé par olivier252 Voir le message
    la ligne 17 correspond à la ligne 7 ici; Je ne comprends pas comment ma référence pstmt est nulle.
    Ce n'est pas pstmt qui est null, mais connection !
    Une NullPointerException ne concerne jamais ce qui est affecté, mais l'expression évaluée pour déterminer la valeur à affecter.
    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.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    En effet, j'aurais du dire "pstmt pointe vers null" ?

  4. #4
    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 : 55
    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
    Citation Envoyé par olivier252 Voir le message
    En effet, j'aurais du dire "pstmt pointe vers null" ?
    Non plus. pstmt n'existe plus, parce que c'est connection.prepareStatement(request) qui provoque la NullPointerException, et que ceci provoque l'arrêt immédiat de l'exécution, sortie de la méthode addPersonn, et donc pstmt n'existe plus, donc ne pointe sur rien du tout.
    C'est connection qui est null. C'est la seule possibilité avec une NPE sur cette ligne. Il faut donc chercher pourquoi. A priori, aucun code exécuté ne lui affecte une valeur.

    Au passage, je viens de le voir, pourquoi fait-on un rollback sur ConnexJDBC, alors qu'on exécute la requête et on la commit par connection ?

    A noter également que le statement n'est pas fermé en cas d'exception SQL (dans le cas où le statement est bien créé évidemment). Utilise un try-with-resource.
    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.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Ok,
    Au passage, je viens de le voir, pourquoi fait-on un rollback sur ConnexJDBC, alors qu'on exécute la requête et on la commit par connection ?
    En fait, c'est en cas d'erreur dans le try que le rollback se produit, mais le sns de ta remarque m'échappe sans doute
    Voici la méthode rollback de ConnexJDBC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void rollback() {
    		try {
    			cnx.rollback();
    		} catch (SQLException e) {
    			System.out.println(e.getMessage());
    		}
    		System.out.println("rollback effectué");
    	}


    A priori, aucun code exécuté ne lui affecte une valeur.
    L'appel de la constante QUERY_INSERT_PERSONNE fait référence à l'interface PersonneQuery suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface PersonneQuery {
    	static String QUERY_INSERT_PERSONNE = "insert into personne_table (nom, prenom) values(?,?)";
    }
    Utilise un try-with-resource.
    Comme ceci ?
    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 void addPersonn(Personne p) {
    		String request = PersonneQuery.QUERY_INSERT_PERSONNE;
     
    		try (PreparedStatement pstmt = connection.prepareStatement(request)){
     
    			pstmt.setString(1, p.getNom());
    			pstmt.setString(2, p.getPrenom());
     
    			int flag = pstmt.executeUpdate();
    			if (flag >= 1) {
    				System.out.println(flag + "ligne(s) ajoutée(s)");
    				connection.commit();
    			} else { ...............................
    Du coup le try-with-ressources permet de se passer de fermer le PreparedStatement ( grace à l'interface Autoclosable (si j'ai compris ?)

    MErci

  6. #6
    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 : 55
    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
    Citation Envoyé par olivier252 Voir le message
    En fait, c'est en cas d'erreur dans le try que le rollback se produit, mais le sns de ta remarque m'échappe sans doute
    Voici la méthode rollback de ConnexJDBC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void rollback() {
    		try {
    			cnx.rollback();
    		} catch (SQLException e) {
    			System.out.println(e.getMessage());
    		}
    		System.out.println("rollback effectué");
    	}
    Le sens de ma remarque est que
    1. normalement, on fait une transaction à partir d'une même connexion : tous les ordres doivent être lancés avec la même instance de java.sql.Connection. Sinon on fait des insert dans une transaction et qu'on en rollback une autre en cas d'erreur, ça ne sert à rien.
    2. si ConnexJDBC est une connexion active (ou plutôt cnx exactement dans ton cas) et que tu utilises connection pour faire l'insert, peut-être que connection n'est pas initialisée, même si cnx l'est. Rien ne me permet de savoir si cnx et connection pointent vers la même instance de Connection, ou si même, l'une ou l'autre pointe bien vers une instance de Connection (donc est null ou pas). Le sens de ma remarque était que cette distinction de variables pouvaient être un indice pour comprendre pourquoi connection est null. C'est courant lorsqu'on multiplie les variables, surtout pour représenter la même chose : on affecte une variable et on oublie de le faire pour l'autre. Pire, on affecte une valeur différente aux deux, ou c'est ce qui finit par se passer au cours de l'exécution, alors qu'elles sont censées représenter la même chose.
    3. et pourquoi faire une méthode static dans une autre pour faire le rollback sur une autre variable, et pas faire directement connection.rollback() dans la méthode de traitement, au moins par cohérence.
    4. en résumé, tout ça pour continuer à dire qu'il faut s'intéresser à cette variable connection pour savoir pourquoi elle vaut null lors de l'invocation de preparedStatement().



    Citation Envoyé par olivier252 Voir le message

    L'appel de la constante QUERY_INSERT_PERSONNE fait référence à l'interface PersonneQuery suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface PersonneQuery {
    	static String QUERY_INSERT_PERSONNE = "insert into personne_table (nom, prenom) values(?,?)";
    }
    Ok, mais ce n'est pas pertinent dans la problématique du NullPointerException qui nous occupe.
    Cependant, faire des interfaces pour uniquement définir des constantes a été en usage certes, y'a une vingtaine d'années (et je l'ai utilisée moi-même), mais ça fait longtemps qu'on sait qu'il ne faut pas procéder comme ça. Une interface n'est pas faite pour ça. Si il est tentant de faire une interface en se disant qu'on peut implémenter de l'interface pour hériter des "constantes", il est préférable de faire une classe normale (éventuellement avec constructeur private pour éviter une instanciation contre productive), et de faire des imports static éventuellement. Avec une classe standard, on fait référence à la constante avec la même facilité que si c'était une interface, donc on ne gagne rien à faire une interface. Eventuellement, si la "constante" a besoin d'être qualifiée, un enum est envisageable, ce qui facilite par ailleurs le traitement masse.


    Citation Envoyé par olivier252 Voir le message

    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 void addPersonn(Personne p) {
    		String request = PersonneQuery.QUERY_INSERT_PERSONNE;
     
    		try (PreparedStatement pstmt = connection.prepareStatement(request)){
     
    			pstmt.setString(1, p.getNom());
    			pstmt.setString(2, p.getPrenom());
     
    			int flag = pstmt.executeUpdate();
    			if (flag >= 1) {
    				System.out.println(flag + "ligne(s) ajoutée(s)");
    				connection.commit();
    			} else { ...............................
    Du coup le try-with-ressources permet de se passer de fermer le PreparedStatement ( grace à l'interface Autoclosable (si j'ai compris ?)
    En réalité, le try-with-resources ferme de lui-même l'ensemble des ressources crées, ici le PreparedStatement en effet (grâce à l'interface AutoCloseable oui). C'est le développeur du coup qui peut se passer d'invoquer explicitement la méthode close().
    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.

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

Discussions similaires

  1. [MySQL] INSERT INTO qui ne fonctionne pas mais qui fonctionne
    Par quiky dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 09/12/2009, 15h31
  2. [A-03] Insert Into qui n'insère PAS.
    Par Milyshyn76 dans le forum VBA Access
    Réponses: 10
    Dernier message: 23/10/2008, 15h29
  3. Insert into qui ne fonctionne pas ?
    Par Little_flower dans le forum VBA Access
    Réponses: 3
    Dernier message: 05/08/2008, 10h12
  4. [MySQL] insertion étendue qui ne fonctionne pas
    Par osseili20 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/02/2008, 10h39
  5. [MySQL] INSERT INTO qui ne veut pas marcher
    Par Tee shot dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/03/2007, 17h42

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