PreparedStatement успешно выполняется в Oracle, но выдает исключение в Microsoft SQL - PullRequest
4 голосов
/ 09 января 2012

У меня есть следующий запрос, который я выполняю, используя java PreparedStatement:

String dml=insert into users(name, addr, city, sex, dob) values(?,?,?,?,?);
PreparedStatement stmt = conn.prepareStatement(dml);
stmt.setString(1,"abcd");
stmt.setString(2,"def");
stmt.setString(3,"ghij");
stmt.setString(4,"m");
stmt.setString(5,"1-Jan-1987");
stmt.executeQuery();

Он успешно выполняется, когда база данных - Oracle, но когда база данных - Microsoft SQL, то выдает исключение "java.sql.SQLException: The executeQuery method must return a result set".Может кто-нибудь сказать, пожалуйста, в чем проблема здесь.Почему тот же запрос успешно выполняется в Oracle, но не в Microsoft SQL Server?

Ответы [ 6 ]

13 голосов
/ 09 января 2012

Ответ содержится в сообщении - ExecuteQuery требует набора результатов.Вместо этого используйте executeUpdate .

Из приведенной выше ссылки:

  • boolean execute () Выполняет оператор SQL в этом PreparedStatementобъект, который может быть любым видом оператора SQL.

  • ResultSet executeQuery () Выполняет запрос SQL в этом объекте PreparedStatement и возвращает объект ResultSet, сгенерированный запросом..

  • int executeUpdate () Выполняет оператор SQL в этом объекте PreparedStatement, который должен быть оператором SQL INSERT, UPDATE или DELETE;или оператор SQL, который ничего не возвращает, такой как оператор DDL.

тот факт, что он работает на oracle, вероятно, является лишь побочным эффектом, на который вы обнаружили, на который нельзя полагаться.

4 голосов
/ 09 января 2012

Если вы выполняете инструкцию INSERT / UPDATE, вы должны вызывать stmt.executeUpdate(), а не stmt.executeQuery(). Я полагаю, что есть разница (хотя я не знаю точно, что именно) между драйверами Oracle и SQL Server, которые вы используете, это означает, что один работает, а другой нет.

2 голосов
/ 09 января 2012

попробуйте использовать метод executeUpdate вместо executeQuery.

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

1 голос
/ 26 декабря 2012

Существует проблема на stmt.executeQuery();

  • executeQuery() используется для операции SELECT sql

  • executeUpdate() используется дляОперация INSERT, UPDATE и DELETE sql.

Ваш запрос для операции INSERT, поэтому, пожалуйста, используйте stmt.executeUpdate();

0 голосов
/ 11 мая 2016

используйте stmt.execute(); вместо stmt.executeQuery();

  • stmt.execute(); or executeUpdate(); для вставки, обновления, удаления (и т. Д.)
  • stmt.executeQuery(); для SELECT
0 голосов
/ 09 января 2012

Это зависит от драйвера , который использует, и базовой реализации метода executeQuery () .При использовании оператора Java Prepared базовая реализация допускает это, но драйвер SQL-сервера не позволяет этого.

Попробуйте использовать правильный метод для выполнения оператора вставки, например executeUpdate ().

.: -

Сервер Sql: - http://msdn.microsoft.com/en-us/library/ms378540%28v=sql.90%29.aspx

Oracle: - http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/statement.html

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