关闭的结果集:jsp页面中的下一个错误,在通过myEclipse从ojdbc14.jar升级到ojdbc7.jar之后



在&当返回到JSP页面时,如下所示访问它然后循环遍历结果集,将数据放到页面字段中。

在ojdbc14.jar下工作正常,但现在通过myEclipse项目升级到ojdbc7.jar(用于Oracle 12c)。获取封闭结果集:访问第一个结果集时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 

这是一个生命周期问题。如果关闭数据库连接,所有相关的结果集也将关闭。(没有连接到数据库了。别问我以前为什么管用。

所以你必须改变你的代码,使它遵循这个顺序:

  1. 运行存储过程并检索游标/结果集
  2. 执行JSP页面
  3. 关闭数据库连接

如果作为存储过程的out参数检索的结果集在语句关闭后仍然存在,则无法找到任何信息。我想是的。如果没有,在关闭语句之前还需要等待。

问题是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);

最新更新