2009-11-05 58 views
1

我使用的MS JDBC驅動程序調用一個2005 MS SQL Server存儲過程和要處理的結果集之前訪問輸出參數在SQL Server設置處理結果之前訪問輸出參數如下:通過JDBC

 proc = "{call mySproc(?,?,?)}"; 
     conn = ds.getConnection(); 
     callableStmt = conn.prepareCall(proc); 
     callableStmt.setString(1,inputParam); 
     callableStmt.registerOutParameter(2,Types.INTEGER); 
     callableStmt.registerOutParameter(3,Types.INTEGER); 
     callableStmt.execute(); 

     rs = (ResultSet)callableStmt.getResultSet(); 
     output[0] = callableStmt.getInt(2); //@rc 
     output[1] = callableStmt.getInt(3); //@rs   

     if(output[0] != 0){ 
      //do some stuff 
     } else { 
      // process result set 
     } 

問題是在處理結果集之前訪問輸出參數會導致結果集關閉。

有沒有一種方法可以在不改變存儲過程的情況下執行此操作?

可以通過JDBC爲其他數據庫執行此操作。然而,從研究我發現JDBC Spec狀態:

最大的可移植性,某一調用的 ResultSet對象和更新計數應該 越來越 輸出參數的值之前處理。

MS JDBC驅動程序是否已經實施到法律規定,其他JDBC驅動程序是否提供了更靈活的實現?

希望有人能澄清我對這個問題的理解。

回答

2

輸出參數在所有結果集合後出現在電線上。任何客戶端,無論平臺或技術如何,都必須首先解析所有結果,然後才能看到輸出參數值。

如果在使用結果集之前有客戶端提供輸出參數的值,則表示它們將結果集緩存在內存中。考慮到結果集可能會增加報價,這很糟糕。