游标状态无效 - 从 sql table 检索整数值时没有当前行

Invalid cursor state - no current row when retrieving integer value from sql table

我一直在搜索这个问题,但没有解决我的问题,我正在尝试从 sql table 获取注册用户的 ID(即 INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY )调用 "USERS",调用 int _id = rs2.getInt("UserID"); 时抛出异常:Invalid cursor state - no current row. 这是我目前所拥有的:

在Servlet.java中:

try{
    stmt = conn.prepareStatement(UAppConstants.SELECT_USERID_BY_NAME);
    System.out.println("1");
    stmt.setString(1, _username);
    System.out.println("2");
    ResultSet rs2 = stmt.executeQuery();
    System.out.println("3");
    int _id = rs2.getInt("UserID"); //exception here
    System.out.println("the registered user id is" +  _id);

}catch (SQLException e) {
        System.err.println(e.getMessage()); // print error
}

在UAppConstants.java中:

public final String CREATE_USERS_TABLE = "CREATE TABLE USERS (UserID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY,username varchar(10) NOT NULL,password varchar(8) NOT NULL,description varchar(50) DEFAULT NULL,nickname varchar(20) NOT NULL,photo varchar(100) DEFAULT NULL)";
public final String INSERT_USER_STMT = "INSERT INTO USERS (username,password,nickname,description,photo) VALUES (?,?,?,?,?)";
public final String SELECT_USERID_BY_NAME = "SELECT UserID FROM USERS WHERE username=? ";

UserModel.java:

public class User {
private String Username, Password, Description, Photo,Nickname;//user "schema"
private int UserID;


public User(String name, String pass, String nick,String desc,String photo ) {
    Username = name;
    Password = pass;
    Description = desc;
    Photo = photo;
    Nickname = nick;
}



/* Getters & Setters */

public int getUserID() {
    return UserID;
}

public void setUserID(int uid) {
    this.UserID = uid;
}

//the rest of getters and setters

异常:

INFO: Reloading Context with name [/ExampleServletv3] is completed
        1
        2
        3
        Invalid cursor state - no current row.

有人可以指导我做什么吗? 谢谢

executeQuery之后,光标位于第一行之前。所以你还不能访问任何数据。首先,您需要调用next()将光标移动到第一行。

所以应该是:

stmt = conn.prepareStatement(UAppConstants.SELECT_USERID_BY_NAME);
stmt.setString(1, _username);
ResultSet rs2 = stmt.executeQuery();
if (rs2.next()) {
    int _id = rs2.getInt("UserID");
    // do something with the id
} else {
    // user not found
}

关于异常处理的提示:不要用枯燥的打印语句来粉饰您的代码,并且除了非常少的消息之外不处理异常,而是重新抛出异常:

try {
    // code
} catch (SQLException e) {
    throw new RuntimeException(e);
}

这样你会得到一个完整的错误消息,包括所有嵌套的异常,你也会得到抛出异常的行。