Maison > Article > base de données > Pourquoi mon code Java obtient-il une exception MySQLSyntaxError malgré l'utilisation d'un PreparedStatement ?
JDBC renvoie une exception MySQLSyntaxError malgré une déclaration correcte
Lors de la tentative d'insertion de nouvelles lignes dans une table MySQL, une application Java a rencontré une exception MySQLSyntaxError. Après examen de l'instruction SQL, elle semble syntaxiquement correcte. Cependant, lorsqu'elle est exécutée directement à l'aide de MySQL Workbench, l'instruction a réussi.
Le code en question utilisait un PreparedStatement pour exécuter l'instruction INSERT, comme indiqué ci-dessous :
<code class="java">PreparedStatement sInserim = conn.prepareStatement(sqlCommandInserim); sInserim.setString(1, utente); sInserim.setString(2, nome); sInserim.executeUpdate(sqlCommandInserim);</code>
L'exception rencontrée était :
<code class="text">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</code>
Après un examen plus approfondi, il a été révélé que les espaces réservés (?) n'étaient pas correctement remplacés par le PreparedStatement. Cela ressortait clairement de la ligne suivante :
<code class="java">sInserim.executeUpdate(sqlCommandInserim);</code>
La méthodeexecuteUpdate() était invoquée avec la chaîne SQL brute comme argument, au lieu d'utiliser l'objet PreparedStatement avec ses valeurs définies.
Pour corriger le problème, le code a été modifié comme suit :
<code class="java">sInserim.executeUpdate();</code>
En utilisant executeUpdate() sans argument de chaîne SQL, les valeurs de PreparedStatement sont automatiquement utilisées, résolvant ainsi l'exception MySQLSyntaxError.
Remarque :
Bien que cela ne soit pas directement lié au problème indiqué, il est recommandé de fermer le PreparedStatement (et toute autre ressource, telle que Connection, Statement et ResultSet) dans un bloc final pour é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!