超级郁闷:为什么用了JavaBean之后,老是出错呢?

MM0668 2003-09-16 10:00:06
出错信息为:
/*
Operation not allowed after ResultSet closed
*/
数据库方面肯定没有问题
(因为不用JavaBean就没问题)

1.JavaBean文件为:
package mysql;
import java.sql.*;

public class Jdbc_conn{
String sDBDriver="org.gjt.mm.mysql.Driver";
String sConnStr="jdbc:mysql://localhost:3306/test";
Connection conn=null;
ResultSet rs=null;

public Jdbc_conn(){
try{
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e){
System.out.println("Jdbc_conn():"+e.getMessage());
}
}

public ResultSet executeQuery(String sql)throws Exception{
rs=null;
try{
sql=new String(sql.getBytes("GBK"),"ISO8859_1");
conn=DriverManager.getConnection(sConnStr);
Statement stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
conn.close();
stmt.close();
}
catch(SQLException ex){
System.out.println("sql.executeQuery:"+ex.getMessage());
}
return rs;
}
}

2.JSP中相关部分的文件为:
<jsp:useBean id="sql_conn" scope="page" class="mysql.Jdbc_conn" />
<%
ResultSet rs=sql_conn.executeQuery("select * from client");
%> <%
//利用while循环将数据表中的记录列出
while(rs.next()){
%>
<TR bgcolor="Yellow">
<TD><FONT SIZE=2><B><%=rs.getString("Number")%></B></FONT></TD>
<TD><FONT SIZE=2><B><%=rs.getString("Client")%></B></FONT></TD>
<TD><FONT SIZE=2><B><%=rs.getString("City")%></B></FONT></TD>
</TR>
<%
}
rs.close();//关闭ResultSet对象
//stmt.close();//关闭Statement对象
//con.close();//关闭Connection对象
%>

...全文
46 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
timtin0361 2003-09-17
  • 打赏
  • 举报
回复
把return rs放在
conn.close();
stmt.close();

之前 试一下
cunguo 2003-09-17
  • 打赏
  • 举报
回复
去掉executeQuery过程中的这两句:
conn.close();
stmt.close();
试试!!!
majors 2003-09-17
  • 打赏
  • 举报
回复
我觉得你应该将从数据库查询得到的结果封装到另外的与数据库无关的对象内,然后再在jsp页面循环这个新的对象。
像你那样使用ResultSet实际上你已经它已经关闭了,虽然你可以指望java的垃圾回收机制回收不用的对象,那恐怕也得等到数据库连接超时为止吧,要知道数据库连接是很宝贵和有限的。
另外你也可以使用一下RowSet对象,这种对象似乎具有智能些的功能。
lsfsl 2003-09-17
  • 打赏
  • 举报
回复
public ResultSet executeQuery(String sql)throws Exception
{
rs=null;
try{
sql=new String(sql.getBytes("GBK"),"ISO8859_1");
conn=DriverManager.getConnection(sConnStr);
Statement stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
conn.close();//去掉
stmt.close();//去掉
}
catch(SQLException ex){
System.out.println("sql.executeQuery:"+ex.getMessage());
}
return rs;
}
}
MM0668 2003-09-16
  • 打赏
  • 举报
回复
我是这样的啊:

<%
try{
ResultSet rs=sql_conn.executeQuery("select * from client");
out.println(rs);
%>
<TABLE border="2" bordercolor="#FF0099" bgcolor="Black">
<TR bordercolor="green" bgcolor="Blue">
<TD><FONT SIZE=4><B>编号</B></FONT></TD>
<TD><FONT SIZE=4><B>客户</B></FONT></TD>
<TD><FONT SIZE=4><B>城市</B></FONT></TD>
</TR>
<%
//利用while循环将数据表中的记录列出
while(rs.next()){
%>
<TR bgcolor="Yellow">
<TD><FONT SIZE=2><B><%=rs.getString("Number")%></B></FONT></TD>
<TD><FONT SIZE=2><B><%=rs.getString("Client")%></B></FONT></TD>
<TD><FONT SIZE=2><B><%=rs.getString("City")%></B></FONT></TD>
</TR>
<%
}
rs.close();//关闭ResultSet对象
}catch(Exception e)
{out.println("无法打开");
}

%>
rs在try块内!
Wnyu 2003-09-16
  • 打赏
  • 举报
回复
去掉executeQuery过程中的这两句:
conn.close();
stmt.close();
不用担心内存问题, 因为Java有隐式的垃圾收集器, 可以自动释放和回收Conn和stmt的内存空间。
Yanbin_Q 2003-09-16
  • 打赏
  • 举报
回复
上面的写法,把Rs申明在try块内了,只能在try块内有效
MM0668 2003-09-16
  • 打赏
  • 举报
回复
try{
ResultSet rs=sql_conn.executeQuery("select * from client");
...............................
...............................

}catch(Exception e)
{out.println("无法打开");
}
结果是无法打开,
5555555555555555
MM0668 2003-09-16
  • 打赏
  • 举报
回复
1.
是不是public ResultSet executeQuery(String sql)
中的conn.close();
stmt.close();
使rs的返回值无效呢?

2.
还是Jsp文件中
<%
ResultSet rs=sql_conn.executeQuery("select * from client");
%>
rs不一定能创建成功呢?


81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧