JDBC 例外: 有効な SQL ステートメントの MySQLSyntaxError
この記事では、JDBC を使用してデータをMySQLデータベース。 MySQL Workbench で有効な INSERT ステートメントを実行したにもかかわらず、MySQLSyntaxError 例外を受け取りました。
根本的な原因を調査するには、コードを分析しましょう:
<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>
スタック トレースの検査:
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 を受け取ることがわかります。これはコードの見落としです。
解決策:
この問題を解決するには、次の行を次の行に置き換えます:
<code class="java">sInserim.executeUpdate(sqlCommandInserim);</code>
<code class="java">sInserim.executeUpdate();</code>
PreparedStatement でexecuteUpdate() を呼び出すことにより、JDBC はsetString() メソッドを使用して設定された値を持つプレースホルダー (?) は、構文エラーを防ぎます。
追加の考慮事項:
finally を使用することも推奨されます。ブロックを使用してすべてのデータベース オブジェクト (PreparedStatements、Connections、Statements、ResultSets) を閉じ、次のような場合のリソース リークを防ぎます。例外。
以上が有効な INSERT ステートメントを使用しているにもかかわらず、JDBC コードが MySQLSyntaxErrorException をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。