環境:資料庫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 />