Closed Resultset:从ojdbc14.jar通过myEclipse升级到ojdbc7.jar后,jsp页面中的下一个错误

时间:2016-09-22 12:20:53

标签: java jsp jdbc

在下面的Java类中创建两个结果集&当返回到jsp页面时,请在下面访问它&然后遍历结果集以将数据放在页面字段上。

与ojdbc14.jar工作正常,但现在通过myEclipse项目升级到ojdbc7.jar(对于Oracle 12c)。获取Closed Resultset:访问第一个结果集时,jsp页面中的下一个错误。

任何想法或建议请完成升级吗?

我知道我可以使用集合等,但尝试保持代码与返回的游标结果集相同,以便在jsp页面中访问。感谢您的帮助。

jsp页面:

<%
BCSData vBCS =   
(BCSData)session.getAttribute("com.sherwin.barcodeshipping.bcsData");
%>

<TABLE class="data" >
<TR class="header">
   <TD class="dataTxt"> Order Number    </TD> 
   <TD class="dataTxt">  Rex            </TD>
   <TD class="dataTxt">  Size Code      </TD>
   <TD class="dataTxt">  Loc            </TD>
   <TD class="dataNbr">  Total Cartons  </TD>
   <TD class="dataNbr">  Total Pallets  </TD>
   <TD class="dataNbr">  Total Weight   </TD>
   <TD class="dataNbr"> Total Units     </TD> 
   <TD class="dataNbr"> Order Units     </TD> 
   <TD class="dataNbr"> Order Qty       </TD>                    
</TR>
<% 
 while (vBCS.bolResultSet.next())
 {   
%>
 <TR class="body"> 
   <TD class="dataTxt"><%= vBCS.bolResultSet.getString(1) %> </TD>
   <TD class="dataTxt"><%= vBCS.bolResultSet.getString(2) %> </TD>
   <TD class="dataTxt"><%= vBCS.bolResultSet.getString(3) %> </TD>
   <TD class="dataTxt"><%= vBCS.bolResultSet.getString(4) %> </TD>
   <TD class="dataNbr"><%= vBCS.bolResultSet.getFloat(5) %>  </TD>
   <TD class="dataNbr"><%= vBCS.bolResultSet.getFloat(6) %>  </TD>
   <TD class="dataNbr"><%= vBCS.bolResultSet.getFloat(7) %>  </TD>
   <TD class="dataNbr"><%= vBCS.bolResultSet.getFloat(8) %>  </TD>
   <TD class="dataNbr"><%= vBCS.bolResultSet.getFloat(9) %>  </TD>
   <TD class="dataNbr"><%= vBCS.bolResultSet.getFloat(10) %> </TD>

 </TR>
<%                       
  }
%>
</TABLE>

<HR class="innerMed" > 

<TABLE class="data">
   <TR class="header">
       <TD class="dataTxt"> WHS            </TD> 
       <TD class="dataTxt"> Customer       </TD>
       <TD class="dataTxt"> Dock           </TD>           
       <TD class="dataNbr"> Total Pallets  </TD>
       <TD class="dataNbr"> Total Weight   </TD>
       <TD class="dataNbr"> Total Units    </TD>                  
  </TR>
<% 
   while (vBCS.bolSummaryResultSet.next())
   {   
%>  
   <TR class="body"> 
      <TD class="dataTxt"><%= vBCS.bolSummaryResultSet.getString(1) 
%> </TD>
      <TD class="dataTxt"><%= vBCS.bolSummaryResultSet.getString(2) 
%> </TD>
      <TD class="dataTxt"><%= vBCS.bolSummaryResultSet.getString(3) 
%> </TD>
      <TD class="dataNbr"><%= vBCS.bolSummaryResultSet.getFloat(4)  
%> </TD>
      <TD class="dataNbr"><%= vBCS.bolSummaryResultSet.getFloat(5)  
%> </TD>
      <TD class="dataNbr"><%= vBCS.bolSummaryResultSet.getFloat(6)  
%> </TD>       
   </TR>
<%
   } // while
%>
</TABLE>

创建和关闭结果集的Java类:

public ResultSet           bolResultSet;
public ResultSet           bolSummaryResultSet;

public Integer assignDock(String pDBSource, String pLoginID)
{   
Integer             vRetCode;
String              vRetMsg;
Connection          vConnection = null;
CallableStatement   vCallStmt   = null;

try
{        
    vConnection = DBConnection.getConnection(pDBSource, pLoginID);
    //System.out.println("BCSData.java assignDock");
    vCallStmt = vConnection.prepareCall
    ("BEGIN ship_door_assignment_pkg.assign_dock (?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?, ?,?,?,?); END;");

    vCallStmt.setString(1, plantCode);
    vCallStmt.setString(2, dock);
    vCallStmt.setString(3, p1.palLbl);
    vCallStmt.setFloat(4,  p1.cartonQty);
    vCallStmt.setFloat(5,  p1.palSize);
    vCallStmt.setFloat(6,  p1.drumGallons);
    vCallStmt.setFloat(7,  p1.drumGross);
    vCallStmt.setFloat(8,  p1.drumTare);
    vCallStmt.setString(9, p2.palLbl);
    vCallStmt.setFloat(10, p2.cartonQty);
    vCallStmt.setFloat(11, p2.palSize);
    vCallStmt.setFloat(12, p2.drumGallons);
    vCallStmt.setFloat(13, p2.drumGross);
    vCallStmt.setFloat(14, p2.drumTare);
    vCallStmt.setString(15, printer);
    vCallStmt.registerOutParameter(16, OracleTypes.NUMBER);
    vCallStmt.registerOutParameter(17, OracleTypes.VARCHAR);
    vCallStmt.registerOutParameter(18, OracleTypes.CURSOR);   
    vCallStmt.registerOutParameter(19, OracleTypes.CURSOR); 

    vCallStmt.execute();

    vRetCode  = vCallStmt.getInt(16);
    vRetMsg   = vCallStmt.getString(17); 

    if (vRetCode == 0)
    {               
        bolSummaryResultSet = (ResultSet)vCallStmt.getObject(18);
        bolResultSet = (ResultSet)vCallStmt.getObject(19);  
    }   
    else
    {   errorMsg = vRetMsg;
    }

}
catch (SQLException se)
{
    throw new RuntimeException(se);
}
finally
{       
    DBConnection.closeCallableStatement(vCallStmt);
    DBConnection.closeConnection(vConnection);
}       

return vRetCode;    

}  //assignDock 

2 个答案:

答案 0 :(得分:0)

这是一个生命周期问题。如果关闭数据库连接,则还会关闭所有相关结果集。 (再也没有与数据库的连接。不要问我为什么以前有用。)

因此,您必须更改代码,使其遵循以下顺序:

  1. 运行存储过程并检索游标/结果集
  2. 执行JSP页面
  3. 关闭数据库连接
  4. 如果在语句关闭后将检索到的结果集作为存储过程的out参数存在,则无法找到任何信息。我认同。如果没有,您还需要在关闭声明之前等待。

答案 1 :(得分:0)

问题是ResultSet也必须关闭,通常在语句结束之前关闭。该语句或连接可能会关闭结果集。但是,有一些标志可以使结果使用更长时间,甚至是单独的类型。但是通常的做法是将ResultSet铲到某个列表中,然后使用它。

试试这个:

vCallStmt = vConnection.prepareCall("BEGIN ship_door_assignment_pkg.assign_dock"
        + "(?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?, ?,?,?,?); END;",
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.HOLD_CURSORS_OVER_COMMIT);

最后一个选项应该有用。