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() をチェックして true の場合は、別の getResultSet() を試してください。今回は適切な結果セットが返されます。

任意のポインタをお願いします? (問題がある場合は、JTDS ドライバーを使用しています)

ありがとう、ラージ

4

2 に答える 2

2

のJavadocgetResultSet()は、「...結果が更新カウントであるか、それ以上結果がない場合」にnullを返すと述べています。ストアド プロシージャには更新カウント結果セットがあり、getResultSet()メソッドは (ほぼ間違いなく) API コントラクトがすべきことを実行しているようです。

最初に更新カウントを取得してみてください。それ以外の場合は、「回避策」に固執してください。

于 2010-06-16T04:39:45.497 に答える
2

正解が選択された後に回答を投稿するのは無意味だと思います。

私が提案する解決策は呼び出すことです

set nocount on

insert ステートメントの前と

set nocount off

その後。それ以外の場合、挿入は結果セットを返します。

于 2011-11-16T21:54:18.683 に答える