Exception JDBC : MySQLSyntaxError with Valid SQL Statement
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 :
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;
}
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 :
sInserim.executeUpdate(sqlCommandInserim);
With:
sInserim.executeUpdate();
En appelant executeUpdate() sur PreparedStatement, JDBC remplacera les espaces réservés (?) avec 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 toutes les bases de données. objets (PreparedStatements, Connections, Statements et ResultSets) pour éviter les fuites de ressources en cas d'exceptions.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3