结果集自动关闭并显示错误结果集关闭后不允许操作

Posted

技术标签:

【中文标题】结果集自动关闭并显示错误结果集关闭后不允许操作【英文标题】:Resultset automatically close itself and showing error Operation not allowed after ResultSet closed 【发布时间】:2016-02-26 18:45:41 【问题描述】:

获取异常

java.sql.SQLException: ResultSet 关闭后不允许操作

<%
ResultSet rs=null,rs1=null;
Statement stmt=null,stmt1=null;
String UserID = request.getParameter("UserID"); 
String Password = request.getParameter("Password");
session.setAttribute("UserID",UserID);
int flag=0;
try    
    System.out.println("Validating..1");
    //stmt =  con.createStatement();
    //stmt1 =  con.createStatement();

    String Query = "select * from login where UserID = '"+UserID+"' and Password='"+Password+"'";
    System.out.println(Query);
    rs = st.executeQuery(Query);
    System.out.println(rs);
    if(rs!=null)
    
        String Query1="Select * from basicdetails where UserID='"+UserID+"' and Password='"+Password+"'";
        System.out.println(Query1);
        rs1=st.executeQuery(Query1);
        //System.out.println(rs1);
        if(!rs1.next())
        
            System.out.println("RS1");
            while(rs1.next())
            
                String PhotoPath=rs1.getString(4);
                System.out.println("-------------------"+PhotoPath);
                session.setAttribute("PhotoPath",PhotoPath);
            
        
    
    if(!rs.next())
    
        String Auth=rs.getString(3);
        session.setAttribute("Auth",new Integer(Auth));
        flag=1;
        if(Auth.equals("0"))
        
            //Show Admin Menu
        %>
        <jsp:forward page="AdminMenu.jsp"/>
    <%
    
        else if(Auth.equals("1"))
        
            //Show user Menu
    %>
    <jsp:forward page="UserHome.jsp"/>
    <%
    
    
    else
    
        flag=0;
    %>
    <jsp:forward page="Login.jsp"/>
    <%
    
    stmt.close();
    con.close();
catch(Exception e)
            System.out.println(e.getCause());
                        System.out.println(e.getStackTrace());
                        System.out.println(e.getClass());
            %><%=e%><%
        

%>

这是 Netbeans 输出窗口中显示的消息

Validating..1 select * from login where UserID = 'admin' and 密码='admin' com.mysql.jdbc.JDBC4ResultSet@b2c1e7 Select * from basicdetails where UserID='admin' and Password='admin' RS1 null [Ljava.lang.StackTraceElement;@1d8608c 类 java.sql.SQLException

上述代码是什么问题,即 .jsp 文件试图验证管理员和其他用户的登录凭据。

【问题讨论】:

明显的问题是jsp中的java代码。尝试重构使用标签库或jstl表达式,它可能会更容易调试 stmt.close(); 也会关闭ResultSet @ElliottFrisch 即使我删除了最后两行 stmt.close();con.close(); 仍然得到同样的错误 主密码:' OR 1=1 --。您需要切换到使用prepared statements。 每个人都在谈论他们自己的观点,没有人能解开我的疑惑。我只是在问为什么 rs1 自己关闭是什么原因。我不是在寻求解决方案 【参考方案1】:

你正在执行ResultSet.next(),它已经返回false。

这段代码没有任何意义。您正在检查rs == null,它不能为空。 executeQuery() 返回的 ResultSets 不能为空。你可以用一个查询和一个连接来完成整个事情。为什么你会在两个表中都有一个密码字段是一个谜,否则第二个查询是一个错误。

【讨论】:

如果 id 和密码错误,为什么 rs 不能为空,那么 rs 将为空 如果查询没有返回任何行,结果集将是empty,而不是null 好吧 rs 不能为空,那么有没有办法检查 rs 是否为空? 认真的吗?你读过Javadoc吗?当没有更多行时,ResultSet.next() 返回 false。如果行数为零,则在您第一次调用它时返回 false。 @EJP 谢谢 EJP 至少你提到了原因,但我昨天才通过阅读 Java Doc 得到了答案,我发出了问题。【参考方案2】:

在得到各位专家的回答后,我更改了我在问题中发布的整个代码。作为初学者,我们期待您的正确指导和适当的说明,仅此而已。这是代码-

<%
ResultSet rs=null,rs1=null;

    String UserID = request.getParameter("UserID"); 
    String Password = request.getParameter("Password");
    session.setAttribute("UserID",UserID);
    int flag=0;
    try    
        System.out.println("Validating..1");
        int Auth=1,flag1 = 0;

        String Query = "select * from login where UserID = '"+UserID+"' and Password='"+Password+"'";
        String Que = "select * from basicdetails where userid='"+UserID+"' and password='"+Password+"';";
        System.out.println(Que);
        rs = st.executeQuery(Query);
        int i=0;
        while(rs.next())
        
            if(UserID.equals(rs.getString(1)) && Password.equals(rs.getString(2)))
            
               Auth=rs.getInt(3);
               session.setAttribute("Auth",new Integer(Auth));
            
            i++;
        
        rs.close();

        if(i>0)
        
         System.out.println("I " + i);
            if(Auth==1)
            
                System.out.println("USER Verification");
            rs1= st.executeQuery(Que);
            System.out.println(rs1);
            rs1.next();
            String PhotoPath=rs1.getString(4);
            System.out.println("-------------------"+PhotoPath);
            session.setAttribute("PhotoPath",PhotoPath);
            %>
                <jsp:forward page="UserHome.jsp"/>
            <%
            
            else if(Auth==0)
            
            %>
                <jsp:forward page="AdminMenu.jsp"/>
            <%
            
        
        else
        
            %>
            <jsp:forward page="Login.jsp"/>
            <%
                
        st.close();
        con.close();
    
    catch(Exception e)
    
    %>
      <%=e%>
    <%  %>

谢谢大家,对有点粗鲁深表歉意。再次感谢。

【讨论】:

根据查询条件,用户 ID 和密码已经等于提供的参数。您无需再次测试它们。你不能忽略ResultSet.next().的结果你还没有解释为什么你在两个表中有密码列。 @EJP UserID 是两个表中的主键,我尝试在 SQL 中使用 join 并成功完成,但对于管理员登录,只有 join 不起作用,因为管理员登录详细信息不在 basicdetails桌子。因此,对于用户加入工作正常,但对于管理员加入查询失败。这是查询String Query = "select l.UserID,l.Password,l.Auth,b.UserID,b.Password,b.PhotoPath from login l,basicdetail b where l.UserID = '"+UserID+"' and l.Password='"+Password+"' and l.UserID = b.UserID;,这对于基本详细信息表中的用户来说很好,但对于管理员来说这不起作用。

以上是关于结果集自动关闭并显示错误结果集关闭后不允许操作的主要内容,如果未能解决你的问题,请参考以下文章

关闭连接会自动关闭语句和结果集吗? [复制]

准备好的语句,结果集和查询问题[关闭]

连接关闭时结果集未关闭?

连接关闭时结果集未关闭?

关闭多个语句和结果集的有效方法?

ResultSet 关闭错误后不允许操作