2

我在 SQL Server 2005 中有一个存储过程,如下所示(简化)

CREATE PROCEDURE FOO
 @PARAMS
AS
BEGIN
  -- STEP 1: POPULATE tmp_table
  DECLARE @tmp_table TABLE (...)
  INSERT INTO @tmp_table
      SELECT * FROM BAR

  -- STEP 2: USE @tmp_table FOR FINAL SELECT
  SELECT abc, pqr
    FROM BAZ JOIN @tmp_table 
    ON some_criteria
END

当我从 SQL Server Management Studio 运行这个过程时,一切正常。但是,当我从 Java 程序调用相同的 proc 时,使用类似:

cs = connection.prepareCall("exec proc ?,");
cs.setParam(...);
rs = cs.getResultSet(); // BOOM - Null!

while(rs.next()) {...} // NPE!

我不明白为什么返回的第一个结果集是 NULL。谁可以给我解释一下这个?

作为一种解决方法,如果我检查 cs.getMoreResults() 并且如果为真,请尝试另一个 getResultSet() - 这次它返回正确的结果集。

请问有什么指点吗?(如果重要的话,我正在使用 JTDS 驱动程序)

谢谢,拉吉

4

2 回答 2

2

Javadoc forgetResultSet()说它返回 null “......如果结果是更新计数或没有更多结果”。看起来您的存储过程将具有更新计数结果集,并且该getResultSet()方法(可以说)只是在执行 API 合同所说的应该执行的操作。

您可以先尝试检索更新计数。否则,请坚持使用您的“解决方法”。

于 2010-06-16T04:39:45.497 回答
2

我猜在选择正确答案后发布答案是毫无意义的。

我建议的解决方案是打电话

set nocount on

在插入语句之前和

set nocount off

然后。否则插入返回结果集。

于 2011-11-16T21:54:18.683 回答