Exception JDBC : MySQLSyntaxError avec une instruction SQL valide
Dans cet article, nous abordons un problème rencontré lors de l'utilisation de JDBC pour insérer des données dans un Base de données MySQL. Nous avons reçu une exception MySQLSyntaxError malgré l'exécution d'une instruction INSERT valide dans MySQL Workbench.
Pour enquêter sur la cause sous-jacente, analysons le code :
<code class="java">public static boolean aggiungiElem(String nome, GrafoGenerico g){ if(connessioneAperta()){ try{ String sqlCommandUser = "SELECT USER()"; String sqlCommandInserim = "INSERT INTO salvataggi VALUES ( ? , ? , DEFAULT , NULL );"; PreparedStatement sUser = conn.prepareStatement(sqlCommandUser); ... // Execute user query PreparedStatement sInserim = conn.prepareStatement(sqlCommandInserim); sInserim.setString(1, utente); sInserim.setString(2, nome); System.out.println(sInserim); sInserim.executeUpdate(sqlCommandInserim); ... // Close PreparedStatements and ResultSet } catch(SQLException e){ e.printStackTrace(); return false; } } else return false; }</code>
Examen de la trace de la pile :
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? , ? , DEFAULT , NULL )' at line 1
Cette erreur indique qu'il y a une erreur de syntaxe dans l'instruction SQL. Cependant, notre instruction INSERT semble être correcte.
En y regardant de plus près, nous remarquons que la méthodeexecuteUpdate() prend un argument String SQLCommandInserim au lieu du PreparedStatement sInserim. Il s'agit d'un oubli dans le code.
Solution :
Pour résoudre ce problème, remplacez la ligne suivante :
<code class="java">sInserim.executeUpdate(sqlCommandInserim);</code>
Par :
<code class="java">sInserim.executeUpdate();</code>
En appelant executeUpdate() sur PreparedStatement, JDBC remplacera les espaces réservés (?) par les valeurs définies à l'aide de la méthode setString(), évitant ainsi l'erreur de syntaxe.
Considérations supplémentaires :
Il est également recommandé d'utiliser le bloc final pour fermer tous les objets de la base de données (PreparedStatements, Connections, Statements et ResultSets) afin d'éviter les fuites de ressources en cas d'exceptions.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!