PreparedStatement在oracle中成功执行但在Microsoft SQL中抛出异常

时间:2012-01-09 10:22:04

标签: java sql sql-server oracle

我有以下查询,我使用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中成功执行但不在microsft sql中执行?

6 个答案:

答案 0 :(得分:13)

答案在消息中--ExecuteQuery需要一个结果集。请改用executeUpdate

从以上链接:

  • boolean execute()在此PreparedStatement对象中执行SQL语句,该语句可以是任何类型的SQL语句。

  • ResultSet executeQuery()在此PreparedStatement对象中执行SQL查询,并返回查询生成的ResultSet对象。

  • int executeUpdate()在此PreparedStatement对象中执行SQL语句,该语句必须是SQL INSERT,UPDATE或DELETE语句;或者什么都不返回的SQL语句,例如DDL语句。

它在oracle上工作的事实可能只是你发现不能依赖的副作用。

答案 1 :(得分:4)

如果您正在执行INSERT / UPDATE语句,则应该调用stmt.executeUpdate()而不是stmt.executeQuery()。我想你正在使用的Oracle和SQL Server驱动程序之间存在差异(虽然我不确切知道是什么),这意味着一个工作,另一个不工作。

答案 2 :(得分:2)

尝试使用executeUpdate方法而不是executeQuery。

由于手头的查询不是选择查询,因此失败。 executeQuery用于select-queries,executeUpdate用于insert,delete和update-queries。

答案 3 :(得分:1)

stmt.executeQuery();

存在问题
  • executeQuery()用于SELECT sql操作

  • executeUpdate()用于INSERT,UPDATE和DELETE sql操作。

您的查询是针对INSERT操作的,因此请使用stmt.executeUpdate();

答案 4 :(得分:0)

这取决于正在使用的驱动程序以及 executeQuery()方法的底层实现。使用Java Prepared语句时,底层实现允许这样做,但SQL服务器的驱动程序不允许这样做。

尝试使用正确的方法执行insert语句,如executeUpdate()。

通过这个链接: -

Sql server: - 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

答案 5 :(得分:-1)

使用stmt.execute();代替stmt.executeQuery();

  • stmt.execute(); or executeUpdate();用于INSERT,UPDATE,DELETE(等)
  • stmt.executeQuery();用于SELECT