2 qq 32274169 qq_32274169 于 2016.02.11 18:58 提问

运行后错误为ResultSet is closed,求助。已经迷茫好几天了,实在想不出来 5C

问题描述:HTTP Status 500 - org.apache.jasper.JasperException:
javax.servlet.ServletException: java.sql.SQLException: java.sql.SQLException:[color=#FF0000] ResultSet is closed[/color]

代码如下(userDao.java)类:
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.ArrayList;
import vo.user;
public class userDao {
//访问数据库
private Connection conn = null;
ArrayList users=new ArrayList();
user us=null;
public user queryAllUser(String username) throws Exception {
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:D");
String sql ="SELECT * FROM tb_Member where username='"+username+"'";
Statement stat=conn.createStatement();
ResultSet rs = stat.executeQuery(sql);
while (rs.next()) {
us = new user();
us.setUsername(rs.getString(1));
us.setPassword(rs.getString(3));
return us;
}
stat.close();
rs.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(conn!=null){
conn.close();
conn=null;
}
}catch(Exception ex){
}
}
return us;
}}

vo包里的user.java类:
package vo;
public class user {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

最重要的登录需要提交的jsp页面代码:
<%@ page language="java" import="java.util.*" import="java.sql.*" pageEncoding="gb2312"%>
<%@ page import="vo.user,dao.userDao"%>
<%
request.setCharacterEncoding("gb2312");
String username=request.getParameter("username");
String password=request.getParameter("PWD");
if(username!=null&&password!=null){
userDao userdao=new userDao();
user us=userdao.queryAllUser(username);
try{
if(us==null){
out.println("输入错误,该用户名不存在 ");
}else{
out.println("密码输入错误");
if(password.equals(us.getPassword())){
A句:session.setAttribute("UserName",username);(本句有错,但是我需要这一句,因为我要保存UserName,下一个页面要用的)

                //B句session.setAttribute("password",password);//若是注销A句,执行B句是可以运行的。请大家帮我看看到底怎么回事,我已经思考了好几天了也没想出来[大哭]
                response.sendRedirect("index.jsp");
            }
        }
    }catch(Exception e){
       e.printStackTrace();
    }
}

%>

3个回答

caozhy
caozhy   Ds   Rxr 2016.02.11 21:18

while (rs.next()) {
us = new user();
us.setUsername(rs.getString(1));
us.setPassword(rs.getString(3));
return us;
}
stat.close();
rs.close();
你这样写
stat.close();
rs.close();
得不到执行的机会。

另外确认你的字段下标(从0开始算)是1和3。最好用字段名。

session.setAttribute("password",password);没有必要在session中保存密码。

qwe885167759
qwe885167759 层主说的对
接近 2 年之前 回复
qq_32274169
qq_32274169 request.setCharacterEncoding("gb2312");String username=request.getParameter("username");String password=request.getParameter("PWD");if(username!=null&&password!=null){userDao userdao=newuserDao();user us=userdao.queryAllUser(username);try{if(us==null){ out.println("输入错误,该用户名不存在 "); }else{ out.println("密码输入错误"); if(password.equals(us.getPassword())){ //session.setAttribute("UserName",username); //注销这句是可以运行的。可是我想要在session中保存Username,就报错:ResultSet is closed
接近 2 年之前 回复
qq_32274169
qq_32274169 我不想在session中保存密码的。想要保存的是Username,但是一执行就会报错:ResultSet is closed
接近 2 年之前 回复
qq_32274169
qq_32274169 字段下标是对的。
接近 2 年之前 回复
qq_16414307
qq_16414307   2016.02.13 11:34

先关闭 rs就可以了

rs.close();
stat.close();

qwe885167759
qwe885167759   2016.02.13 18:56

把rs放到finally中执行,楼主的程序语句的执行时间顺序上有点小问题

qwe885167759
qwe885167759 看错了,抱歉
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!