[JAVA] mySQL ajout d'une entrée

Résolu
Bonjour,
Je débute en SQL, j'ai écrit ce code java en m'inspirant d'autre code trouvé un peu partout...

import java.sql.* ; 

public class Main {
	public static void main(String[] args){
		
		String pilote = "com.mysql.jdbc.Driver";
		
		try {
			Class.forName(pilote);
			
			Connection connexion = DriverManager.getConnection("jdbc:mysql://localhost/donne", "root", "");
		
			java.sql.Statement instruction=connexion.createStatement() ;
			System.out.println("connexion réussi");
			
			ResultSet retour0= instruction.executeQuery("SELECT * FROM utilisateur");
			ResultSet retour1= instruction.executeQuery("INSERT INTO utilisateur values (null, 'jean', 'Dupont', '22')") ;
			System.out.println(retour0 + "\n\n" + retour1);
			
			}catch (Exception sql_erreur) { //Si erreur
				System.err.println("Erreur !");
			}
			
	
	}

}


voila donc sa marche jusqu'à "SELECT * FROM utilisateur" mais après sa fait une erreur je sais pas pourquoi, je ne crois pas m'être trompé dans la syntaxe...
Merci d'avance
Configuration: Windows Vista
Firefox 3.0.5

13 réponses

  1. Bonjour,

    Je ne connais pas SQL, mais pourquoi (null, 'jean', 'Dupont', '22') et non (null, "jean", "Dupont", "22") ?

    Cordialement,

    Dan
    1. Contributeur
      Bonsoir,
      Modifie ceci :
      catch (Exception sql_erreur) { //Si erreur
      System.err.println("Erreur !");
      }


      Par ceci :
      catch (Exception sql_erreur) { //Si erreur
      System.err.println(sql_erreur.getStackTrace());
      }


      Et dis nous exactement de quoi il en retourne.

      Cordialement,
      1. Salut,

        Bon je viens de "tomber" sur une réponse de kriesgraf ici:
        http://www.commentcamarche.net/forum/affich 6780340 java sql pb insert into
        (à consulter peut-etre) et j'ai constaté que la syntaxe 'jean', 'Dupont', '22' est correcte.

        Désolé,

        Dan
        1. Merci pour vos réponce.
          Marco, quand je fait ce que tu ma dit, sa met : "[Ljava.lang.StackTraceElement;@1100d7a"
          Danimo, je n'ai pas compris :(
          merci encore
          1. Contributeur
            Bonsoir,
            Désolé, je me suis planté :(
            Remplaces maintenant ceci :
            catch (Exception sql_erreur) { //Si erreur
            System.err.println(sql_erreur.getStackTrace());
            }


            Par ceci stp :
            catch (Exception sql_erreur) { //Si erreur
            sql_erreur.printStackTrace();
            }


            Merci
        2. Bonjour,

          >>> alec.po:

          Désolé, ne connaisant pas sql, j'aurais mieux fait de m'abstenir de répondre.

          En fait je trouvais "anormal" cette syntaxe:

          ("INSERT INTO utilisateur values (null, 'jean', 'Dupont', '22')") ; (les ' )

          Mais en consultant d'autres messages, je me suis rendu compte que cette forme d'écriture était était aussi présente et j'en ai conclu que c'était la bonne.
          Je t'ai donc indiqué le lien et pas de chance c'est mal sorti. Je l'ai donc réenvoyé.

          Cordialement,

          Dan
          1. Merci quand même Danimo.
            Marco, maintenant sa donne ça :
            java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
            at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
            at com.mysql.jdbc.Statement.checkForDml(Statement.java:417)
            at com.mysql.jdbc.Statement.executeQuery(Statement.java:1140)
            at Main.main(Main.java:17)
            1. Contributeur
              Bonsoir,
              Essaie donc de remplacer ceci :
              ResultSet retour1= instruction.executeQuery("INSERT INTO utilisateur values (null, 'jean', 'Dupont', '22')") ;

              par ceci :
              int retour2= instruction.executeUpdate("INSERT INTO utilisateur values (null, 'jean', 'Dupont', '22')") ;

              Ensuite, comme le signale william7007, une chose je ne sais pas si la derniere valeur que tu veux introduire dans la table est un nombre ou un texte (22) si c'est un nombre alors tu doit l'écrire sans cote(').

              Cordialement,
          2. bonjour ou bonsoir
            je ne alors les gars ça fonctionne maintenant ou pas ?

            je ne sais pas si je sort du jeu mais pour moi je ne voterais pas 1 euro pour le code après le SELECT pourquoi? simplement que tu ouvre la table en mode lecture ce qui est tres bien, le SGBDR accepte ta requete et sans toute fois decherger le premier Statement question de liberer les ressoy=urce de la table afin que celle ci puis repondre à d'autres requete tu la fait subir du coup une deuxieme requete il y'a de quoi elle refuseras voir mm se metra en colère (je rigole). je dit simplement qu'il faut juste apres la premiere connection tu liberes les resources de la table et apres tu te reconectes à nouveau à la table ben essaie ce ci voir et met moi au courant

            
            try {
            		Class.forName(pilote);
            		
            		Connection connexion = DriverManager.getConnection("jdbc:mysql://localhost/donne", "root", "");
            	
            		java.sql.Statement instruction =null;
            		instruction = connexion.createStatement() ;
            		System.out.println("connexion réussi");
            		
            		// ici tu introduit d'abord les données dans la table
            		
            		ResultSet retour1= instruction.executeQuery("INSERT INTO utilisateur values(null, 'jean', 'Dupont', '22')") ;
            		instruction.close();
            		
            		// Ici tu lis les données de la table
            
            		instruction = connexion.createStatement();
            		ResultSet retour0= instruction.executeQuery("SELECT * FROM utilisateur");
            		instruction.close();
            		
            		/*
            		 S'il y'a beaucoup de données dans la table le mieux 
            		 est de faire une boucle pour les afficher tous 
            		 affin de ne pas avoir de surprise
            		 //*/
            
            		System.out.println("Liste des Utilisateurs");
            		while(retour0.next()){
            			System.out.println(retour0.getString(0)+"  "+retour0.getString(1)+"   "+retour0.getString(2)+"   "+retour0.getString(3));
            		}
            		
            		
            		}catch (SQLException sql_erreur) { //Si erreur
            			System.err.println("Erreur !");
            		}
            
            


            hhohohooh

            une chose je ne sais pas si la derniere valeur que tu veux introduire dans la table est un nombre ou un texte (22) si c'est un nombre alors tu doit l'écrire sans cote(') donc tu ecris simplement

            ResultSet retour1= instruction.executeQuery("INSERT INTO utilisateur values(null, 'jean', 'Dupont', 22)") ;
            


            et il n'y a pas d'space entre values et la parenthèse ouvrant.

            cdlt
            1. Merci de vos réponce :
              Marco j'ai tester çà :
              import java.sql.* ; 
              
              public class Main {
              	public static void main(String[] args){
              		
              		String pilote = "com.mysql.jdbc.Driver";
              		
              		try {
              			Class.forName(pilote);
              			
              			Connection connexion = DriverManager.getConnection("jdbc:mysql://localhost/donne", "root", "");
              		
              			java.sql.Statement instruction=connexion.createStatement() ;
              			System.out.println("connexion réussi");
              			
              			int retour2= instruction.executeUpdate("INSERT INTO utilisateur values (null, 'jean', 'Dupont', 22)") ; 
              			
              			}catch (Exception sql_erreur) { //Si erreur
              				System.err.println("Erreur !");
              			}
              			
              	
              	}
              
              }
              


              Erreur...

              William, j'ai tester ton code il me fait une erreur aussi :( alors j'ai enlever la partie "liste des Utilisateurs", même erreur...

              Et c'est bien un int la dernière valeur, alors j'ai enlever les (').

              Je comprend pas la lecture marche bien pourtant...
              Merci pour votre aide c'est sympa.
              1. as tu enlevé l'espace entre "VALUES" et "{" ?
                1. Contributeur
                  Je viens de regarder au niveau de la documentation, l'espace n'est pas gênant en fait, le problème vient d'ailleurs.

                  Cordialement,
              2. Contributeur
                Et vire ton : System.err.println("Erreur !"); dans ton catch, ça ne nous donne aucune indication.
                Laisse donc le sql_erreur.printStackTrace(); stp.

                Cordialement,
                1. :)

                  java.sql.SQLException: Column count doesn't match value count at row 1
                  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
                  at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
                  at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
                  at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
                  at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
                  at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402)
                  at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317)
                  at Main.main(Main.java:19)
                  1. Contributeur
                    L'erreur te dit que tu donne trop ou pas assez d'indications dans ton insert.
                    La première des choses à faire, c'est de virer le "null" pour l'identifiant (ce n'est pas à toi de le spécifier en général, sauf si tu utilises les GeneratorType et autres trucs de la JPA, mais je ne pense pas que ce soit à toi de le faire).

                    Le mieux, c'est d'adapter ta requête en spécifiant les colonnes que tu souhaites renseigner. Modifie donc ton :
                    int retour2= instruction.executeUpdate("INSERT INTO utilisateur values (null, 'jean', 'Dupont', 22)") ;

                    En : int retour2= instruction.executeUpdate("INSERT INTO utilisateur ('prenom', 'nom', 'age') values ('jean', 'Dupont', 22)") ;

                    Cordialement,
                2. Merci infiniment, c'était le "null" qui provoquait l'erreur...
                  Sa marche nickel maintenant. :)
                  Merci encore Marco.