Java Closed Resultset:jsp页面中的下一个错误,在通过myEclipse从ojdbc14.jar升级到ojdbc7.jar之后
在下面的Java类中创建两个结果集&当返回到jsp页面时,访问下面的结果集&然后循环遍历结果集,将数据放在页面字段中 在ojdbc14.jar上工作正常,但现在通过myEclipse项目升级到了ojdbc7.jar(适用于Oracle 12c)。获取关闭的结果集:访问第一个结果集时jsp页面中的下一个错误 升级完成后,您有什么想法或建议吗 我知道我可以使用集合等,但我试图保持代码与返回的游标结果集相同,以便在jsp页面中访问。谢谢你的帮助 jsp页面:Java Closed Resultset:jsp页面中的下一个错误,在通过myEclipse从ojdbc14.jar升级到ojdbc7.jar之后,java,jsp,jdbc,Java,Jsp,Jdbc,在下面的Java类中创建两个结果集&当返回到jsp页面时,访问下面的结果集&然后循环遍历结果集,将数据放在页面字段中 在ojdbc14.jar上工作正常,但现在通过myEclipse项目升级到了ojdbc7.jar(适用于Oracle 12c)。获取关闭的结果集:访问第一个结果集时jsp页面中的下一个错误 升级完成后,您有什么想法或建议吗 我知道我可以使用集合等,但我试图保持代码与返回的游标结果集相同,以便在jsp页面中访问。谢谢你的帮助 jsp页面: <% BCSData vBCS =
<%
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>
这是一个生命周期问题。如果关闭数据库连接,所有相关结果集也将关闭。(数据库已经没有连接了。不要问我以前为什么它能工作。) 因此,您必须更改代码,使其遵循以下顺序:
如果作为存储过程的out参数检索的结果集在语句关闭后继续存在,我找不到任何信息。我认为是这样。如果没有,您还需要等待,然后才能关闭语句。问题是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);
P>最后一个选项应该工作。谢谢你的建议,并将考虑第二个。但是,你提到他们的标志,使结果使用更长时间。。。你能解释一下这是怎么做的吗。当我在java类中创建结果集时,这里有一个sysout,然后在进入jsp页面时阅读它们:这里是sysout:BCSData.java assignDock bolSummaryResultSet:oracle.jdbc.driver。ForwardOnlyResultSet@70b37e69BCSData.java assignDock bolResultSet:oracle.jdbc.driver。ForwardOnlyResultSet@399dd91bBCSSummary.jsp assignDock bolsummary结果集:oracle.jdbc.driver。ForwardOnlyResultSet@70b37e69 BCSSummary.jsp assignDock bolResultSet:oracle.jdbc.driver。ForwardOnlyResultSet@399dd91b注意:我看到oracle.jdbc.driver。。。不确定这对于ojdbc7.jar驱动程序的驱动程序节点是否可以接受。但如果你能详细说明设置。谢谢。对不起,我刚看到你关于打开结果集的建议。请稍候。游标\u OVER \u COMMIT);-我会试试的。谢谢
vCallStmt = vConnection.prepareCall("BEGIN ship_door_assignment_pkg.assign_dock"
+ "(?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?, ?,?,?,?); END;",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);