Java Probleme d'insert into

Voila , je tente de crée une nouvelle entrée à partir d’un formulaire , tout ça en java, et je sors dans le catch, je supose que c’est à cause du Insert Into qui est mauvais, mais je trouve pas où. Voilà déjà la table dans laquelle je veux inséré mes données xxxxx( format ):

id_bug (int, auto_incrément) | date( date) | service ( text) | nom_dec (texte) | mail_dec (text) | nom_sign(text) | mail_sign(text) | titre (text) | descript (text)| id_rep(int) | etat_bug(text) | date_rep(date)

Il y a plusieurs champ que je ne veux pas remplir : id_rep et date_rep, j’ai mis ’ ’ à la place ( comme en php ) mais je suis pas convaincu, qu’en pensez vous?

Enfin , le code :

    Connection conn = null;
    // On récupère les infos du bug
    java.util.Date maDate = new java.util.Date();
    System.out.println(maDate);
    String nomdec = nomdeclarant.getText();
    String maildec = maildeclarant.getText();
    String nomsign = nom_sign.getText();
    String mailsign = mail_sign.getText();
    Object service = choixservice.getSelectedItem();
    String bug = titrebug.getText();
    String descript = descriptbug.getText();
    
    try{
             Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
             conn = DriverManager.getConnection("jdbc:odbc:bugtracker","root","");
             System.out.println("Connexion BDD Ok Ajout Bug");
             Statement s = conn.createStatement ();
             System.out.println("Avant insert");
             s.executeUpdate("insert into bug value ("+ maDate + "','" + service +"','" + nomdec + "', '" + maildec + "', " + nomsign + "','" + mailsign + "', '" + bug + "', '" + descript.replace("'","''") + "','','déclaré','') "); 
             System.out.println("Apres insert");
    }catch (Exception e) { System.err.println ("Erreur de base de donnée insert");} 

Edité le 08/04/2008 à 19:25

Salut,

Tu pourrais nous montrer le message d’erreur ?

dans ton insert into , tu peux spécifier quelles valeurs tu veux ajouter.
exemple :

query = "INSERT INTO clients (nom,prenom,adresse,telephone) VALUES('" + client.getNom() + "','" + client.getPrenom() + "','" + client.getAdresse() + "','" + client.getTelephone() + "')";

dans ta requête il faut que tu vérifies que la syntaxe est correcte, dès ton premier argument il manque un apostrophe (avant maDate).
pour les champs vides, essaie ne plaçant une chaine de caractere vide.

Ben elle est marquée : “Erreur de base de donnée insert”

et merci ,
Je vais essayé de mettre des truc genre (nom,prenom,adresse,telephone).
Je vous tiens au courant ^^


Je sors toujours dans le catch malgré la modification de ma requète :

s.executeUpdate("insert into bug (date_dec,service,nom_dec,mail_dec,nom_sign,mail_sign,titre,descript,etat_bug) value ('"+ maDate + "','" + service +"','" + nomdec + "', '" + maildec + "', " + nomsign + "','" + mailsign + "', '" + bug + "', '" + descript.replace("'","''") + "','déclaré',) "); 

il y a une virgule en trop à la fin de la requête.
pour afficher l’erreur complète tu peux faire :

catch (Exception e) { System.err.println ("Erreur de base de donnée insert : " + e );}

Ouep, tu n’exploites pas complètement le concept des exceptions, avec ce que propose Jiheme on pourra ainsi afficher la la pile et détecter plus facilement l’erreur.

Tu résoudras plus d’erreur en utilisant des PreparedStatement pour éviter les apostrophes non protégées dans ta requête. ie:

PreparedStatement stmt = conn.prepareStatement("insert into bug (date_dec, service, nom_dec, mail_dec, nom_sign, mail_sign, titre, descript, etat_bug) value (?, ?, ?, ?, ?, ?, ?, ?, ?) "
stmt.setDate(1, maDate);
stmt.setString(2, service);
....

Sans oublier de libérer toutes les resources (try {} finally {if (x != null) {x.close();}}…)

Et donc , une fois que j’ai fait les stmt.setxxxx(chiffre , attribut)

je refais la requete normale

s.executeUpdate("insert into bug (date_dec . . . ) value ( maDate,service,nomdec,maildec . . . etc ) 

sans avoir à me soucier des " ’ ’ " et autre guillemet / apostrophe en vrac ??

une fois la requete préparé, il n’y a plus qu’à l’exécuter.

PreparedStatement stmt = conn.prepareStatement("insert into bug (date_dec, service, nom_dec, mail_dec, nom_sign, mail_sign, titre, descript, etat_bug) value (?, ?, ?, ?, ?, ?, ?, ?, ?) "
stmt.setDate(1, maDate);
stmt.setString(2, service);

stmt.executeUpdate();

java.developpez.com…

Mes variables sont :

java.util.Date date = new java.util.Date();
    java.sql.Date maDate = new java.sql.Date(date.getTime());
    String service1;
    System.out.println(maDate);
    String nomdec = nomdeclarant.getText();
    String maildec = maildeclarant.getText();
    String nomsign = nom_sign.getText();
    String mailsign = mail_sign.getText();
    Object service = choixservice.getSelectedItem();
    String bug = titrebug.getText();
    String descript = descriptbug.getText();

Puis l’ajout dans la base de donnée :

PreparedStatement stmt = conn.prepareStatement("insert into bug (date_dec, service, nom_dec, mail_dec, nom_sign, mail_sign, titre, descript, etat_bug) value (?, ?, ?, ?, ?, ?, ?, ?, ?) ");
             stmt.setDate(1,maDate);//setDsetDate(1, maDate);
             service1 = service.toString();
             stmt.setString(2, service1);
             stmt.setString(3,nomdec);
             stmt.setString(4,maildec);
             stmt.setString(5,nomsign);
             stmt.setString(6,mailsign);
             stmt.setString(7,bug);
             descript.replace("'","''");
             stmt.setString(8,descript);

             s.executeUpdate();

mais ça passe toujours pas… :frowning:
Edité le 09/04/2008 à 13:49

ça:

descript.replace("’","’’");
stmt.setString(8,descript);

Ca sert à rien de faire un replace.

Essaye VALUES au lieu de value…

J’ai enlevé
descript.replace("’","’’");

Et j’ai mis values, mais je sors toujours dans le catch. ( j’ai mis des println ) et celui juste apres stmt.executeUpdate() ne s’affiche pas, donc pour précision l’erreur vient bien du insert quoi, je vois vraiment pas…

bah

e.printStackTrace();

et tu peux aussi obtenir des infos sur l’erreur SQL gràce à ton driver SQL… sinon, teste le code SQL en dehors de Java ?

Les erreurs apparaissant ( en rouge ) sont :

java.sql.SQLException: [Microsoft][Pilote ODBC Microsoft Access]Champ COUNT incorrect
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3149)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:216)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPreparedStatement.java:138)

C’est bon j’ai résolu le problème :

VALUES (?, ?, ?, ?, ?, ?, ?, ?, ‘affecté’)