Apabila cuba melaksanakan pertanyaan dengan PreparedStatement dalam Java, ralat berlaku yang menunjukkan ralat sintaks berhampiran "?". Pengecualian ialah:
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 '? or MemberName = ?' at line 1
String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?"; Connection conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD); PreparedStatement s = conn.prepareStatement(query); s.setInt(1, 2); s.setString(2, "zen"); ResultSet rs = s.executeQuery(query); // Fail!
Ralat berlaku kerana MySQL tidak mengenali "?" dalam pertanyaan SQL sebagai pemegang tempat. Ini disebabkan oleh panggilan berikut:
rs = s.executeQuery(query); // Fail!
Daripada menggunakan PreparedStatement#executeQuery tanpa argumen, rentetan pertanyaan asal diluluskan, yang mengatasi pernyataan yang disediakan.
Untuk menyelesaikan isu , kaedah executeQuery bagi PreparedStatement hendaklah dipanggil tanpa hujah:
rs = s.executeQuery(); // OK!
Walaupun tidak berkaitan dengan masalah asal, kod tersebut membocorkan sumber. Untuk mengelakkan ini, sumber hendaklah ditutup menggunakan simpulan bahasa JDBC:
try { // Acquire resources here } catch (Exception e) { // Handle exception } finally { // Close resources here }
Atas ialah kandungan terperinci Mengapa Pernyataan Persediaan Saya di Java Membuang Ralat Sintaks MySQL Dekat '?'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!