[JDBC] Problème générer un INSERT

Problème générer un INSERT [JDBC] - Java - Programmation

Marsh Posté le 14-04-2004 à 04:52:32    

Bonjour.
 
Alors voila en gros j'ai deja fait un programme pour un cours qui utlisait une classe pour "émuler" une base de données.  J'ai déjà remis ce travail, cependant je dois remplacer ma classe Bdd par une vrai bd.
 
Voici un exemple de fonction que j'ai :
 

Code :
  1. public void addAuteur(Auteur a) {
  2.  Statement st;
  3.  String requete = "";
  4.  try {
  5.   st = c.createStatement();
  6.   requete = "INSERT INTO auteur VALUES ("+a+" )";
  7.   st.executeUpdate(requete);
  8.  }
  9.  catch (SQLException e) {
  10.   System.out.println(e.getMessage() +"\nRequête : " + requete);
  11.  }


 
mon toString retourne "code,nom,prenom" donc parfait pour mon insert.
 
Cependant, le probleme est que le nom est composé de la façon suivante :
 
"NOM, PRENOM".
 
Bien entendu quand j'appelle la fonction addAuteur j'ai l'erreur suivante :
 
General error,  message from server: "Column count doesn't match value count at row 1"
Requête : INSERT INTO auteur VALUES (A001,NEWBY, ERIC,GB)
 
 
Donc comment faire pour que NOM, PRENOM ne soit traité comme une seule values (Je ne peux pas séparer nom/prénom dans la bd et je dois le garder sous cette forme).
 
Il est plutôt tard, donc si je ne suis pas clair n'hésitez pas à me le dire et j'essayerais de préciser !
 
Merci !

Reply

Marsh Posté le 14-04-2004 à 04:52:32   

Reply

Marsh Posté le 14-04-2004 à 09:08:45    

Bonjour.
Je vois trois éléments dans ton code et ta conception qui peuvent produire des erreurs :
 - dans la clause INTO de ton code SQL, tu n'indiques pas les colonnes dans lesquelles tu comptes insérer tes valeurs. Ca complique le débuggage... d'ailleurs à quoi correspondent les différentes colonnes ? (j'imagine que AXXX est ta clé, par contre pour le reste je ne comprends pas bien le NEWBY et le GB)
 - le fait d'utiliser un toString implicite te complique plus la tâche qu'autre chose : on ne sait pas exactement ce que tu insères ; il faut aller voir dans ta classe, donc on ne peut pas vérifier de manière directe que tu ne fais pas d'opération incorrecte
 - les chaînes de caractères (CHAR(X)) en SQL sont à encadrer par des apostrophes (simple quotes) => normalement il faut faire :

Code :
  1. INSERT INTO auteur VALUES ('"+a+"')


 
De manière générale, pour éviter les concaténations hasardeuses, mieux faut utiliser un PreparedStatement qu'un statement simple : celui-ci te permet de passer ton code SQL sous forme d'une chaîne de caractères comportant des "?" à la place des valeurs à insérer. Tu dois ensuite faire sur ton statement des setString, setDate, etc., ce qui t'évite les erreurs de type et les conversions à la volée.

Reply

Marsh Posté le 14-04-2004 à 20:46:32    

Merci, je comprend mieux maintenant !

Reply

Marsh Posté le 14-04-2004 à 21:10:36    

Derniere petite question. Quel est la methode normale pour faire ce genre d'operation ?  
 
Devrais-je faire les operations sql au niveau de l'objet Auteur ?
 

Reply

Marsh Posté le 14-04-2004 à 21:37:07    

swgreedo a écrit :

:

Code :
  1. INSERT INTO auteur VALUES ('"+a+"')



heu ... là ca insert qu'un seul champ ... dans sa table il doit avoir plusieurs champs j'imagine ...

Reply

Marsh Posté le 14-04-2004 à 22:46:31    

aaaaaaaaarrgh
 
utilise des "prepared statements", je t'en supplie ! y'en a marre des bugs de sécurité sur des histoires d'échappement, de magic quotes et autres délires psychédéliques !
 

Code :
  1. INSERT INTO auteur VALUES (?)


puis un "bind" de la valeur au "statement" en première position avant exécution.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-04-2004 à 23:13:15    

benou a écrit :


heu ... là ca insert qu'un seul champ ... dans sa table il doit avoir plusieurs champs j'imagine ...

le monsieur a dit que le toString() d'Auteur (dont a est une instance) renvoyait "nom, machin,truc" :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-04-2004 à 23:14:10    

belzme a écrit :

Derniere petite question. Quel est la methode normale pour faire ce genre d'operation ?  
 
Devrais-je faire les operations sql au niveau de l'objet Auteur ?
 
 

Non.
on utilise en general un objet "DAO" (data access object) qui n'est responsable que de ces operations. et sur ta classes Auteur, tu fournis les accesseurs qui vont bien (getName(), getMachin(), getTruc())


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-04-2004 à 23:33:52    

the real moins moins a écrit :

le monsieur a dit que le toString() d'Auteur (dont a est une instance) renvoyait "nom, machin,truc" :D


 :heink: tu blagues ou pas là ?
 
j'imagine que nom, machin et truc sont 3 champs séparés de la table ...

Reply

Marsh Posté le 14-04-2004 à 23:34:46    

benou a écrit :


 :heink: tu blagues ou pas là ?
 
j'imagine que nom, machin et truc sont 3 champs séparés de la table ...

ben non je blague pas, il l'a dit.
et comme il concatene ça dans une String, beh ça devrait marcher :/


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-04-2004 à 23:34:46   

Reply

Marsh Posté le 14-04-2004 à 23:35:55    

euh bon on efface, j'ai rien dit. tu quotais la réponse ou jgreedo lui disait de mettre des ', au temps pour moi


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 15-04-2004 à 00:39:17    

Ok merci pour la réponse du DAO.
 
Pour ce qui est du reste, si j'utilisais le toString, c'est que je voulais mettre le moins d'effort possible pour ce travail car en ce moment au boulot je fait bcp d'heure et j'ai pas bcp de temps a investir dans mon cours.
 
Cependant, je vais quand même faire ca plus propre pour ma conscience (Un preparedStatement qui en utilisant les get de mon objet a insérer dans la bd)
 
Merci bcp pour vos réponses !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed