【问题标题】:Why does my code produce the error: The statement did not return a result set [duplicate]为什么我的代码会产生错误:语句没有返回结果集[重复]
【发布时间】:2014-01-07 07:41:04
【问题描述】:

我正在从 Microsoft SQL Server Studio 执行以下查询,它工作正常并显示结果:

SELECT *
INTO   #temp_table
FROM   md_criteria_join
WHERE  user_name = 'tecgaw'

UPDATE #temp_table
SET    user_name = 'tec'
WHERE  user_name != 'tec'

SELECT *
FROM   md_criteria_join
WHERE  user_name = 'tec'
   AND view_name NOT IN (SELECT view_name
                         FROM   md_criteria_join
                         WHERE  user_name = 'tecgaw')
UNION
SELECT *
FROM   #temp_table
ORDER  BY view_name,
      user_name,
      crit_usage_seq,
      crit_join_seq 

但是,如果我在 Java 中执行相同的查询,则会引发异常说明

语句没有返回结果集。

这是 Java 代码:

statement = conn.getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());

这是因为我不能在一个语句中执行多个 SQL 查询(即,创建 #temp_table,更新它,然后使用我的 select 语句)?

【问题讨论】:

  • 您可以将其重写为单个查询。如果您指出哪些列构成 md_criteria_join 上的主键,我可以为您提供帮助。
  • pk 是我用来排序的最后四列

标签: java sql-server jdbc resultset


【解决方案1】:

我在 StackOverflow here 中发现了类似的问题。您应该启用连接以支持多个语句并使用; 分隔它们。有关具体示例,请参见该答案。但它仅适用于 MySql。

另外我认为您可以将 SQL 重写为单个查询

SELECT columnA, columnB, 'tec' as user_name from md_criteria_join
WHERE (
       user_name = 'tec' 
   AND view_name NOT IN (
       SELECT view_name 
       FROM md_criteria_join 
       WHERE user_name = 'tecgaw')
   )
   OR user_name = 'tecgaw' 
ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq

另一种选择是将语句移动到存储过程并使用 CallableStatement 从 JDBC 调用它

或者你应该尝试使用多个这样的 jdbc 语句来执行它

Connection conn = conn.getConnection(); //just to make sure its on single connection
conn.createStatement("SELECT INTO #temp_table").executeUpdate();
conn.createStatement("UPDATE #temp_table").executeUpdate();
conn.createStatement("SELECT ...").executeQuery();

请注意,您必须关闭资源,也许为了获得更好的性能,您可以使用 addBatch 和 executeBatch 方法

【讨论】:

  • 您链接到的答案是特定于 MySQL 的。 JDBC 语句应该一次执行一条语句,而不是多条语句。
  • 不,你的查询和我的不一样
  • 确实错过了将用户名从 tecgaw 链接到 tec 的点。一种替代方法是使用存储过程并通过 jdbc 调用它
  • 我已更新查询。如果您没有太多列,您可以列出它们并硬编码 user_name 值。
【解决方案2】:

使用execute 语句进行数据操作,例如插入、更新和删除,以及 executeQuery 用于 数据检索,例如 select

我建议您将程序分成两个语句,一个 execute 和一个 executeQuery

如果您不想这样做,请尝试用分号分隔语句。但是我不确定这个动作是否会给你一个结果集。

【讨论】:

  • 好的,如果我创建单独的语句。 temp_table 什么时候会消失?在我关闭结果集后,语句或连接?
  • 临时表将在执行第一个executeexecute语句后很快消失。在那种情况下。使用存储过程和CallableStatement
  • @RavindraGullapalli 你太棒了。谢谢。
【解决方案3】:

JDBC 被行数弄糊涂了。

您需要使用SET NOCOUNT ON

【讨论】:

  • 对于 MS sql,这是您应该尝试的第一个解决方案。 @John 谢谢。
【解决方案4】:

在 ms sql 中,您还必须在存储过程的开头设置 nocount,并使用“;”终止 select / update/ insert 块语句

【讨论】:

  • 天哪,太感谢你了!我遇到了类似的问题,“SET NOCOUNT ON”语句解决了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2021-12-06
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多