JDBC SQL SERVER:该语句未返回结果集

时间:2013-12-18 22:31:17

标签: java sql-server jdbc resultset

我正在从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语句)?

4 个答案:

答案 0 :(得分:28)

JDBC因行数而感到困惑。

您需要使用SET NOCOUNT ON

答案 1 :(得分:17)

数据操作使用execute声明,例如插入,更新和删除, {strong>数据检索 executeQuery,例如选择

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

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

答案 2 :(得分:2)

我在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方法

答案 3 :(得分:1)

在ms sql中你还必须在存储过程开头的右边设置nocount以及用“;”终止select / update / insert块语句