JDBC Exception: MySQLSyntaxError with Valid SQL Statement
在本文中,我們深入研究使用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() 方法採用字串參數 SQLCommandInserim 而非PreparedStatement sInserim。這是代碼中的疏忽。
解決方案:
要解決此問題,請替換以下行:
sInserim.executeUpdate(sqlCommandInserim);
With:
sInserim.executeUpdate();
透過在PreparedStatement上呼叫executeUpdate(),JDBC將取代佔位符(?)使用setString()方法設定值,防止語法錯誤。
其他注意事項:
也建議使用finally區塊關閉所有資料庫物件(PreparedStatements、Connections、Statements 和 ResultSets)以防止發生異常時資源洩漏。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3