我有以下查询,我使用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中执行?
答案 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