Resultset.next 返回 true 但不返回值

Posted

技术标签:

【中文标题】Resultset.next 返回 true 但不返回值【英文标题】:Resultset.next returns true but doesn't return the value 【发布时间】:2016-02-22 04:02:07 【问题描述】:

我正在尝试从 mysql 表中读取数据,并且正在执行以下操作:

protected void pushRegisteredStudentsData() 
    try 
        conn = (Connection) DriverManager.getConnection(DB_URL, USER, PASS);
        stmt = conn.createStatement();

        String userID = "SELECT * FROM STUDENT";
        rs = stmt.executeQuery(userID);
        while (rs.next()) 
            int id = rs.getInt("ID");
            this.studentID = id;
            String insertSql = "INSERT INTO REGISTEREDSTUDENTS(StudentID, ModuleCode) VALUES ('" + studentID + "', + '"
                    + this.moduleCode + "')";
            System.out.println("Inserting into REGISTEREDSTUDENTS.. [" + id + "]" + "[" + this.moduleCode + "]");
            stmt.executeUpdate(insertSql);
        
     catch (SQLException e) 

    

..但出于某种原因,

while (rs.next()) 
    int id = rs.getInt("ID");

总是返回相同的 ID,即使表格每一行都有不同的 ID!

有人知道为什么会这样吗? 先感谢您! :(

编辑: 我使用单个语句执行 2 次更新,这导致了问题!

【问题讨论】:

请直接粘贴您的代码。你试过int id = Integer.parseInt(rs.getObject(1)) ID 列是否唯一,这意味着学生表中是否可以有多个具有相同 ID 的行? 不,因为我以为我不想通过绝对值获取对象,而是逐行读取。@YassinHajaj @DBug ID 是唯一的! 你的ID栏是哪一栏?如果是第一个,我提供的代码应该适用于每一行。 【参考方案1】:

它总是返回相同的值有点奇怪,因为它应该只返回第一个值一次。

如果您打印堆栈跟踪而不是仅仅捕获异常而不做任何事情,您会看到它会打印如下内容:

java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:794)

您对 Select 和 Insert 使用 THE SAME 语句。这会导致“附加”到 Statement 的 resultSet 关闭,因为它不应该再次使用。

可以通过创建另一个语句轻松修复:

        String insertSql = "INSERT INTO REGISTEREDSTUDENTS(StudentID, ModuleCode) VALUES ('" + studentID + "', + '"
                + this.moduleCode + "')";
        System.out.println("Inserting into REGISTEREDSTUDENTS.. [" + id + "]" + "[" + this.moduleCode + "]");
        Statement stmt2 = conn.createStatement();
        stmt2.executeUpdate(insertSql);

【讨论】:

您先生是个传奇人物!如果可以的话,我不会给你1分,而是2分!谢谢! @luanjot

以上是关于Resultset.next 返回 true 但不返回值的主要内容,如果未能解决你的问题,请参考以下文章

ResultSet 不为空,但 resultset.next() 返回 false

ResultSet next() 只返回一行

捕获 ResultSet.next() 的异常

Mockito - 模拟ResultSet

jdbc如何判断记录集是否为空?用啥方法?ResultSet本身是否根本就没有这样的方法?

Java JDBC结果集的处理