问题
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;
}
I am using this code for authenticating a user. The username and password are extracted from the request parameter and passed onto this method for authentication. But it throws a:
org.postgresql.util.PSQLException: ResultSet not positioned properly, perhaps you need to call next.
Please advice.
回答1:
The error is telling you exactly what's wrong - you're not calling next()
on your ResultSet to get to the first row of the results.
This line:
if(rs!=null)
is pointless as far as I know; I don't believe executeQuery
will ever return null. If there's a problem in your query, an exception will be thrown. If there are no results, it will return an empty result set. To see if there's a row, you should call next()
and check the return value:
if (rs.next())
Additionally:
- Catching an exception and just printing the stack trace without rethrowing is almost always the wrong approach
- Your code suggests that you're storing passwords in plain text. Please don't. Really, really don't.
回答2:
Because I got the message even when I called next()
on resultSet
I'll tell my solution.
The solution is NOT to call resultSet.get*
on your resultSet
if it's empty. So do a check if(resultSet.next()){ ...
回答3:
Instead of
if(rs!=null)
You need to check for
if(rs.next())
This will return the first row, if there are any matching rows.
来源:https://stackoverflow.com/questions/12103915/psqlexception-resultset-not-positioned-properly-perhaps-you-need-to-call-next