2010-06-16 124 views
2

我在SQL Server 2005中存儲的過程,它看起來像下面(簡化)NullPointerException異常與CallableStatement.getResultSet()

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中這個PROC,一切工作正常。但是,當我從Java程序中調用相同的進程時,使用類似於:

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

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

我不明白爲什麼返回的第一個結果集是NULL。誰可以給我解釋一下這個?

作爲一種解決方法,如果我檢查cs.getMoreResults()並且如果爲true,請嘗試另一個getResultSet() - 這一次它返回正確的結果集。

任何指針請? (我使用JTDS驅動程序,如果它的事項)

感謝, 拉吉

+0

嗯。你在某個時候調用過'cs.execute()'或'cs.executeQuery()'嗎? – msandiford 2010-06-16 04:53:07

回答

2

getResultSet()的Javadoc說,它返回null」 ......如果結果是更新計數或沒有更多的結果」。它看起來像你的存儲過程將有一個更新計數結果集,並且該getResultSet()方法(可以說)只是做API合約說它應該做的事情。

您可以嘗試先檢索更新計數。否則,堅持你的「解決方法」。

+0

是的。我還注意到的一件事是「executeQuery()」似乎一直工作(永遠不會返回null)。 無論如何接受你的答案...... – ragebiswas 2010-06-16 06:40:14

+0

@Raj - 大概如果你使用executeQuery執行,沒有辦法檢索更新計數。 (問題 - INSERT的更新計數實際上是可檢索的嗎?) – 2010-06-16 06:47:35

2

種類無意義的張貼答案後,正確的答案已被選中我猜。

我建議的解決辦法是調用

set nocount on 
insert語句前

set nocount off 

之後。否則,插入返回一個結果集。