9
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.

请指教。

4

4 回答 4

23

该错误准确地告诉您出了什么问题-您没有调用next()ResultSet 来获取结果的第一行。

这一行:

if(rs!=null)

据我所知是没有意义的;我不相信executeQuery会返回null。如果您的查询有问题,则会抛出异常。如果没有结果,它将返回一个空的结果集。要查看是否有一行,您应该调用next()并检查返回值:

if (rs.next())

此外:

  • 捕获异常并仅打印堆栈跟踪而不重新抛出几乎总是错误的方法
  • 您的代码建议您以纯文本形式存储密码。请不要。真的,真的不要。
于 2012-08-24T06:06:58.843 回答
3

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

如果它是空的,解决方案是不要打电话resultSet.get*给你。resultSet所以做个检查if(resultSet.next()){ ...

于 2014-10-16T14:25:26.013 回答
1

代替

if(rs!=null)

你需要检查

if(rs.next())

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

于 2012-08-24T06:14:42.590 回答
0

也许你resultSet.next()在调试器中有 Inline Watches :)

对我来说就是这样。所以我的检查if (resultSet.next())返回 true 但是当我进入 if 块时,再次调用 next() 然后没有数据所以我得到了相同的错误消息

于 2021-10-21T15:11:24.813 回答