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 出现错误 [重复]