PSQLException:ResultSet未正确定位,也许您需要调用next

时间:2012-08-24 06:03:23

标签: java postgresql postgresql-9.1

public UserBean authenticate(String username,String password){
    PostGresDAO pg=new PostGresDAO();   //creates new connection
    Connection conn=pg.getConnecion();  //return connection object
    PreparedStatement ps;
    ResultSet rs;
    String query="select password,name from scg_users where username=?";
    UserBean ub=null;
    boolean authenticated=false;
    try{
        ps=conn.prepareStatement(query);
        ps.setString(1, username);
        rs=ps.executeQuery();

        if(rs!=null){

            authenticated=password.equals(rs.getString(1));  //exception raised here
            if(authenticated){
                ub=new UserBean();
                ub.setUser(rs.getString(2));
                ub.setUsername(username);
            }
        }
    }
    catch(SQLException e){
        e.printStackTrace();
    }
    return ub;
}

我正在使用此代码验证用户身份。用户名和密码从请求参数中提取并传递给此方法进行身份验证。但它抛出了一个:

org.postgresql.util.PSQLException: ResultSet not positioned properly, perhaps you need to call next.

请建议。

3 个答案:

答案 0 :(得分:15)

错误告诉你完全出了什么问题 - 你没有在ResultSet上调用next()来到达结果的第一行。

这一行:

if(rs!=null)
据我所知,

毫无意义;我不相信executeQuery会返回null。如果查询中存在问题,则会引发异常。如果没有结果,则返回空结果集。要查看是否有一行,您应该调用next()并检查返回值:

if (rs.next())

此外:

  • 捕获异常并只打印堆栈跟踪而不重新抛出几乎总是错误的方法
  • 您的代码表明您以纯文本格式存储密码。请不要。真的,真的没有。

答案 1 :(得分:2)

因为即使我在next()上致电resultSet我收到了消息,我也会告诉我的解决方案。

解决方案是,如果resultSet.get*为空,则不要致电resultSet。所以请检查if(resultSet.next()){ ...

答案 2 :(得分:1)

而不是

if(rs!=null)

您需要检查

if(rs.next())

如果有任何匹配的行,这将返回第一行。