java調用預存程序無法取得返回參數

來源:互聯網
上載者:User

環境:資料庫sql server2005,jdk1.6 ,myeclipse,驅動jdts1.2.2

執行以下代碼,報錯:

String querySQL = "{?=call p_sys_manager_csReport(?,?,?,?,?)}";<br />cstmt = conn.prepareCall(querySQL);<br />cstmt.registerOutParameter(1, java.sql.Types.INTEGER);<br />cstmt.setInt(2, modType);<br />cstmt.setInt(3, dptId);<br />cstmt.setInt(4, eplId);<br />cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);<br />cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);<br />rs = cstmt.executeQuery();<br />if (rs != null) {<br />if (rs.next()) {<br />companyTotal = rs.getInt("companyTotal");<br />}<br />}<br />String temp = null;<br />temp = cstmt.getString(5);//此行報錯

 

報錯資訊為:

java.sql.SQLException: Output parameters have not yet been processed. Call getMoreResults().
    at net.sourceforge.jtds.jdbc.ParamInfo.getOutValue(ParamInfo.java:159)
    at net.sourceforge.jtds.jdbc.JtdsCallableStatement.getOutputValue(JtdsCallableStatement.java:116)
    at net.sourceforge.jtds.jdbc.JtdsCallableStatement.getString(JtdsCallableStatement.java:310)

報錯資訊說得很明白,就是輸出結果參數未處理,必須調用getMoreResults()方法以判斷是否還有結果集。

然後修改代碼,問題解決:

String querySQL = "{?=call p_sys_manager_csReport(?,?,?,?,?)}";<br />cstmt = conn.prepareCall(querySQL);<br />cstmt.registerOutParameter(1, java.sql.Types.INTEGER);<br />cstmt.setInt(2, modType);<br />cstmt.setInt(3, dptId);<br />cstmt.setInt(4, eplId);<br />cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);<br />cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);<br />rs = cstmt.executeQuery();<br />if (rs != null) {<br />if(rs.next()) {<br />companyTotal = rs.getInt("companyTotal");<br />}<br />}<br />String temp = null;<br />/*<br /> *記錄集擷取到後,把rs記錄集迴圈取出後或者調用cstmt.getMoreResults()方法後,sqlserver才會處理output傳回值<br />*/<br />if (!cstmt.getMoreResults()) {//此行判斷是否還有更多的結果集,如果沒有,接下來會處理output返回參數了<br />temp = cstmt.getString(5);//此行不再報錯<br />}<br />

 

其中改為以下代碼也不報錯:

if (rs != null) {<br />while(rs.next()) {//if改為while<br />companyTotal = rs.getInt("companyTotal");<br />}<br />}<br />String temp = null;<br />/*<br /> * 去掉cstmt.getMoreResults(),將上面的if(rs.next()) 改為while(rs.next())也不報錯<br />*/<br />//if (!cstmt.getMoreResults()) {<br />temp = cstmt.getString(5);//此行不再報錯<br />//}<br />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.