Pengecualian JDBC: MySQLSyntaxError dengan Pernyataan SQL Sah
Dalam artikel ini, kami menyelidiki isu yang dihadapi apabila menggunakan JDBC untuk memasukkan data ke dalam pangkalan data MySQL. Kami menerima Pengecualian MySQLSyntaxError walaupun melaksanakan pernyataan INSERT yang sah dalam MySQL Workbench.
Untuk menyiasat punca asas, mari analisa kod:
<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>
Memeriksa surih tindanan:
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
Ralat ini menunjukkan bahawa terdapat ralat sintaks dalam pernyataan SQL. Walau bagaimanapun, penyataan INSERT kami nampaknya betul.
Setelah diperiksa lebih dekat, kami mendapati bahawa kaedah executeUpdate() mengambil argumen String SQLCommandInserim dan bukannya PreparedStatement sInserim. Ini adalah kesilapan dalam kod.
Penyelesaian:
Untuk menyelesaikan isu ini, gantikan baris berikut:
<code class="java">sInserim.executeUpdate(sqlCommandInserim);</code>
Dengan:
<code class="java">sInserim.executeUpdate();</code>
Dengan menggunakan executeUpdate() pada PreparedStatement, JDBC akan menggantikan ruang letak (?) dengan nilai yang ditetapkan menggunakan kaedah setString(), menghalang ralat sintaks.
Pertimbangan Tambahan:
Ia juga disyorkan untuk menggunakan blok akhirnya untuk menutup semua objek pangkalan data (PreparedStatements, Connections, Statements dan ResultSets) untuk mengelakkan kebocoran sumber sekiranya berlaku pengecualian.
Atas ialah kandungan terperinci Mengapa kod JDBC saya membuang MySQLSyntaxErrorException walaupun menggunakan pernyataan INSERT yang sah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!