JDBC 例外: 有効な SQL ステートメントによる MySQLSyntaxError
この記事では、JDBC を使用してデータをMySQLデータベース。 MySQL Workbench で有効な INSERT ステートメントを実行したにもかかわらず、MySQLSyntaxError 例外を受け取りました。
根本的な原因を調査するために、コードを分析してみましょう:
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;
}
スタック トレースの検査:
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
このエラーは、SQL ステートメントに構文エラーがあることを示します。ただし、INSERT ステートメントは正しいようです。
詳しく調べると、executeUpdate() メソッドは PreparedStatement sInserim ではなく String 引数 SQLCommandInserim を受け取ることがわかります。これはコードの見落としです。
解決策:
この問題を解決するには、次の行を置き換えます:
sInserim.executeUpdate(sqlCommandInserim);
With:
sInserim.executeUpdate();
PreparedStatement でexecuteUpdate()を呼び出すことにより、JDBC はプレースホルダー (?) を置き換えます。 setString() メソッドを使用して設定された値を使用して、構文エラーを防ぎます。
追加の考慮事項:
すべてのデータベースを閉じるには、finally ブロックを使用することもお勧めします。例外発生時のリソース リークを防ぐためのオブジェクト (PreparedStatements、Connections、Statements、および ResultSets)。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3