MySQLSyntaxErrorException рядом с "?"при попытке выполнить PreparedStatement - PullRequest
4 голосов
/ 09 ноября 2010

Я пытаюсь выполнить запрос, используя PreparedStatement в Java.

Я получаю сообщение об ошибке 1064 при попытке выполнить запрос (синтаксическая ошибка).

Я проверил это в браузере запросов MySQL с подставленными значениями, который работает нормально.

Что не так с моим кодом?

Вот соответствующий код:

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);

Вот исключение, которое я получаю:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашему Версия сервера MySQL для правильного синтаксиса для использования рядом с '? или MemberName знак равно в строке 1

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '? или MemberName =? ' в строке 1

MySQL не понимает значение ? в запросе SQL. Это действительно неверный синтаксис SQL. Так что почему-то он не был заменен на PreparedStatement. И угадайте что?

PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, intValue);
s.setString(2, strValue);        
rs = s.executeQuery(query); // Fail!

Вы переопределяете подготовленный запрос на исходный запрос! Вам нужно вызвать метод без аргументов PreparedStatement#executeQuery() вместо Statement#executeQuery(String).

PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, intValue);
s.setString(2, strValue);        
rs = s.executeQuery(); // OK!

Не связанный с проблемой, ваш код пропускает ресурсы. Через несколько часов БД исчерпает их, и ваше приложение вылетит. Чтобы это исправить, вам нужно следовать идиоме JDBC закрытия Connection, Statement и ResultSet в блоке finally блока try, где они были получены. Обратитесь к базовому учебнику JDBC для получения более подробной информации.

0 голосов
/ 23 марта 2019

Если вы посмотрите на javadocs для Statement (суперкласс PreparedStatement), метод docs для executeQuery(String) и executeUpdate(String) скажет следующее:

Примечание. Этот метод нельзя вызывать для PreparedStatement или CallableStatement.

Вот что вы здесь делаете: вызываете executeQuery(String) из Statement для PreparedStatement объекта.

Теперь, поскольку Javadocs говорят, что вы «не можете» сделать это, фактическое поведение, которое вы получаете, не определено ... и, вероятно, зависит от драйвера JDBC. В этом случае кажется, что используемый вами драйвер MySQL интерпретирует это как означающее, что вы выполняете обновление как неподготовленный оператор, так что токены ? НЕ интерпретируются как заполнитель параметров. Это заставляет анализатор SQL на стороне сервера сказать «синтаксическая ошибка».

(Для программистов было бы легче, если бы драйвер MySQL выдал другое непроверенное исключение, если вы это сделали; например, UnsupportedOperationException. Однако стандартные JavBCoc JDBC не говорят, что должно происходить в этой ситуации. от поставщика зависит, что сделают его драйверы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...