我知道 - 我们无法在此关闭后致电ResultSet
。这是一个很好的做法,在使用此关闭后关闭每个ResultSet
,Statement
和Connection
但在我的代码中,我从未关闭连接,为什么会有 -
java.sql.SQLException:ResultSet关闭后不允许操作
我的代码如下:
编辑 -
try{
Connection con=CommonUtil.getConnection();
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select * from logirecord");
int flag=0;
while(rs.next()){
if(rs.getString(2).trim().equals(username)&&rs.getString(3).trim().equals(password)){
flag=1;
ResultSet rs1=st.executeQuery("select * from personrecord where LoginId='"+ rs.getString(1).trim()+"'");
if(rs1.next()){
String name=rs1.getString(1);
String address=rs1.getString(2);
String hobby=rs1.getString(4);
}
//Exception here.
ResultSet rs2=st.executeQuery("select * from interest where LoginId='"+rs.getString(1).trim()+"'");
//at com.org.test.LoginServlet.doPost(LoginServlet.java:49)
if(rs2.next()){
String interest=rs2.getString(2);
String interest2=rs2.getString(3);
String interest3=rs2.getString(4);
}
request.getRequestDispatcher("display.jsp").forward(request, response);
return;
}
}
}catch(Exception e){
e.printStackTrace();
}
答案 0 :(得分:2)
您有多个与同时打开的同一Statement对象相关的ResultSet。 (见这里 - http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html):
默认情况下,每个Statement对象只能打开一个ResultSet对象 同时。因此,如果读取一个ResultSet对象是 与另一个的读取交错,每个必须已经生成 通过不同的Statement对象。 Statement中的所有执行方法 如果是,接口隐式关闭一个语句的当前ResultSet对象 打开一个。
而你并没有关闭那使它更糟糕的事情。
答案 1 :(得分:0)
你得到了
java.sql.SQLException: Operation not allowed after ResultSet closed
因为您在遍历另一个相同连接的结果集时尝试遍历结果集。
如果您从同一个数据库中嵌套处理两个结果集,那么您就会做错事。这些集合的组合应该在数据库方面完成。