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

Posted

技术标签:

【中文标题】PreparedStatement 在 oracle 中成功执行,但在 Microsoft SQL 中抛出异常【英文标题】:PreparedStatement executing successfully in oracle but throwing exception in Microsoft SQL 【发布时间】:2012-01-09 10:22:04 【问题描述】:

我使用 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 中却没有?

【问题讨论】:

令人惊讶的是甲骨文“工作”。 @duffymo - 它是 java - oracle 已经使用它多年...... 我知道它是 Java。我认为 Oracle 在这种情况下也应该要求使用 executeUpdate。 非常感谢大家的帮助:) @duffymo - 是的,我同意 - 但就像所有事情一样,一旦副作用公开,就很难改变这种行为,因为害怕破坏兼容性。 【参考方案1】:

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

来自上面的链接:

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

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

int executeUpdate() 执行此 PreparedStatement 对象中的 SQL 语句,必须是 SQL INSERT、UPDATE 或 DELETE 语句;或不返回任何内容的 SQL 语句,例如 DDL 语句。

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

【讨论】:

【参考方案2】:

如果您正在执行 INSERT/UPDATE 语句,您应该调用 stmt.executeUpdate() 而不是 stmt.executeQuery()。我想您使用的 Oracle 和 SQL Server 驱动程序之间存在差异(尽管我不知道具体是什么),这意味着一个有效而另一个无效。

【讨论】:

【参考方案3】:

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

因为手头的查询不是选择查询,所以它会失败。 executeQuery 用于选择查询,executeUpdate 用于插入、删除和更新查询。

【讨论】:

【参考方案4】:

stmt.executeQuery();有问题

executeQuery()用于SELECT sql操作

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

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

【讨论】:

【参考方案5】:

这取决于使用和 executeQuery() 方法的底层实现驱动程序。使用 Java Prepared 语句时,底层实现允许这样做,但 SQL Server 的驱动程序不允许这样做。

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

通过以下链接:-

Sql 服务器:- http://msdn.microsoft.com/en-us/library/ms378540%28v=sql.90%29.aspx

甲骨文:- http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/statement.html

【讨论】:

【参考方案6】:

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

stmt.execute(); or executeUpdate(); 用于插入、更新、删除(等) stmt.executeQuery(); 用于选择

【讨论】:

哇,谢谢马丁。我不具体。但这就是实际的想法

以上是关于PreparedStatement 在 oracle 中成功执行,但在 Microsoft SQL 中抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

PreparedStatement.executeUpdate() 不适用于 Oracle

Oracle JDBC 优化:在 Spring 引导应用程序中启用 PreparedStatement 缓存

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

我想用 Java 代码插入 Oracle 表,但 PreparedStatement 出现错误 [重复]

oracle jdbc中的PreparedStatement和setTimestamp

如何将 Oracle 的 JSON_VALUE 函数与 PreparedStatement 一起使用