Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
903 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°698800
belzme
Hertz ou ne pas hertz...
Posté le 14-04-2004 à 04:52:32  profilanswer
 

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 !

mood
Publicité
Posté le 14-04-2004 à 04:52:32  profilanswer
 

n°698852
swgreedo
Posté le 14-04-2004 à 09:08:45  profilanswer
 

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.

n°699602
belzme
Hertz ou ne pas hertz...
Posté le 14-04-2004 à 20:46:32  profilanswer
 

Merci, je comprend mieux maintenant !

n°699622
belzme
Hertz ou ne pas hertz...
Posté le 14-04-2004 à 21:10:36  profilanswer
 

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 ?
 

n°699639
benou
Posté le 14-04-2004 à 21:37:07  profilanswer
 

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 ...

n°699685
nraynaud
lol
Posté le 14-04-2004 à 22:46:31  profilanswer
 

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
n°699704
the real m​oins moins
Posté le 14-04-2004 à 23:13:15  profilanswer
 

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 ?
n°699705
the real m​oins moins
Posté le 14-04-2004 à 23:14:10  profilanswer
 

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 ?
n°699713
benou
Posté le 14-04-2004 à 23:33:52  profilanswer
 

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 ...

n°699715
the real m​oins moins
Posté le 14-04-2004 à 23:34:46  profilanswer
 

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 ?
mood
Publicité
Posté le 14-04-2004 à 23:34:46  profilanswer
 

n°699717
the real m​oins moins
Posté le 14-04-2004 à 23:35:55  profilanswer
 

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 ?
n°699749
belzme
Hertz ou ne pas hertz...
Posté le 15-04-2004 à 00:39:17  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
Problème de javascript : avec scrollBy et les iframesProblème de requête SQL
[CSS] Problème simple de répétition verticale.[résolu tout seul] Problème avec Gtk => ** (Test Gtk.exe:1144):
Batch qui ne marche pas. Où est le problème ?[PHP] Probleme pour afficher un champ (bd) dans une page PHP
[PHP] problème de variables avec les formulaires (débutant inside)[Java][Tomcat][JSP] Problème de configuration de Tomcat
Probleme de compatibilité MFC directX 9[resolu tout seul ^^] Probleme avec socket & printf
Plus de sujets relatifs à : [JDBC] Problème générer un INSERT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR