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() 方法採用字串參數 SQLCommandInserim 而不是PreparedStatement sInserim。這是代碼中的疏忽。
解決方案:
要解決此問題,請將以下行替換:
<code class="java">sInserim.executeUpdate(sqlCommandInserim);</code>
替換為:
<code class="java">sInserim.executeUpdate();</code>
透過在PreparedStatement上呼叫executeUpdate(),JDBC會將佔位符(?)替換為使用setString()方法設定的值,從而防止語法錯誤。
其他注意事項:也建議使用finally區塊關閉所有資料庫物件(PreparedStatements、Connections、Statements和ResultSet),以防止出現異常時資源外洩。以上是儘管使用了有效的 INSERT 語句,為什麼我的 JDBC 程式碼仍會拋出 MySQLSyntaxErrorException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!