[JAVA] mySQL ajout d'une entrée [Résolu/Fermé]

Signaler
Messages postés
118
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
11 février 2012
-
Messages postés
118
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
11 février 2012
-
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

13 réponses


Bonjour,

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

Cordialement,

Dan
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
331
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,

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

Je ne sais pas pourquoi les tirets manquent après affich et entre les mots qui suivent !!!
http://www.commentcamarche.net/forum/affich 6780340 java sql pb insert into
Messages postés
118
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
11 février 2012
13
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
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
331
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

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
Messages postés
118
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
11 février 2012
13
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)
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
331
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,
Messages postés
335
Date d'inscription
dimanche 28 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2010
47
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
Messages postés
118
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
11 février 2012
13
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.
Messages postés
335
Date d'inscription
dimanche 28 décembre 2008
Statut
Membre
Dernière intervention
23 mars 2010
47
as tu enlevé l'espace entre "VALUES" et "{" ?
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
331
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,
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
331
Et vire ton : System.err.println("Erreur !"); dans ton catch, ça ne nous donne aucune indication.
Laisse donc le sql_erreur.printStackTrace(); stp.

Cordialement,
Messages postés
118
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
11 février 2012
13
:)

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)
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
331
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,
Messages postés
118
Date d'inscription
mardi 10 juillet 2007
Statut
Membre
Dernière intervention
11 février 2012
13
Merci infiniment, c'était le "null" qui provoquait l'erreur...
Sa marche nickel maintenant. :)
Merci encore Marco.