【问题标题】:Getting false while executing rs.next() in my code在我的代码中执行 rs.next() 时出现错误
【发布时间】:2017-06-15 06:18:34
【问题描述】:

rs.next() 在表中有数据时返回 false。使用 oracle 作为数据库。

try {
        ps=con.prepareStatement("select * from users where uname=? and pass=?");
        ps.setString(1, uname);
        ps.setString(2, pass);
        rs=ps.executeQuery();
        out.println(rs.next());
        if (rs.next()) {
            out.println("<font color='green'>Successfull login</font>");
        } else { 
            out.println(uname+"  "+pass);
            out.println("<font color='red'>Wrong username or password.</font>");
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

【问题讨论】:

  • 去掉这条语句out.println(rs.next());,就可以正常使用了
  • if block 没有被执行时,我添加了out.println(rs.next());以了解布尔值。
  • 如果您想记录rs.next() 的结果并且您想稍后使用该值,您必须先将其分配给一个值并记录该值。添加一些关于 SQL 表及其列的信息。也许通行证被存储为散列(应该是)并且您正在搜索它的普通值?
  • 该值没有经过哈希处理,它是普通值。 @Pelocho
  • @Prashant 将 out.println(rs.next()); 放在 IF ELSE 块 之后

标签: java servlets jdbc


【解决方案1】:

当你打电话时

out.println(rs.next());

它移动到下一个结果,然后第二次调用它,下一个结果被调用

如果您在 SQL 中有 1 个结果,它将在您调用 rs.next() 的 if 语句中返回 false

【讨论】:

  • 在评论 rs.next() 之后,如果块没有被执行。
【解决方案2】:

您正在使用 ResultSet 对象资源:

out.println(rs.next());

所以要重用它,你必须添加

rs.previous();

之后

out.println(rs.next());

喜欢

try {
        ps=con.prepareStatement("select * from users where uname=? and pass=?");
        ps.setString(1, uname);
        ps.setString(2, pass);
        rs=ps.executeQuery();
        out.println(rs.next());
        rs.previous();
        if (rs.next()) {
            out.println("<font color='green'>Successfull login</font>");
        } else { 
            out.println(uname+"  "+pass);
            out.println("<font color='red'>Wrong username or password.</font>");
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

【讨论】:

  • rs.previous() 不适用于TYPE_FORWARD_ONLY(这是默认值)结果集,它会抛出异常。
  • @MarkRotteveel,是的,当我使用rs.previous()时它抛出异常@
  • 如果你必须使用rs.previous();然后写ps=con.prepareStatement("select * from users where uname=? and pass=?",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
猜你喜欢
  • 2021-08-16
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多