【问题标题】:Operation not allowed after ResultSet closed when deleting from a database从数据库中删除时 ResultSet 关闭后不允许操作
【发布时间】:2016-06-16 02:45:16
【问题描述】:

我目前正在尝试使用 JDBC 从我的数据库中删除项目,但收到一个错误,我无法弄清楚如何摆脱。错误是:

Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed

这里是java:

    System.out.println("Connecting database for Delete...");
    Integer deletedCount = 0;

    Statement deleteStatement = null;
    try (Connection conn = DriverManager.getConnection(url, username, password)) {
        System.out.println("Database connected!");
        deleteStatement = conn.createStatement();
        String selectDelete = "SELECT id FROM table WHERE end <= (NOW() - INTERVAL 1 HOUR)";

        ResultSet rs = deleteStatement.executeQuery(selectDelete);

            while (rs.next()) {

                String eventid = rs.getString("id");
                String deleteSQL = "DELETE FROM table WHERE id = " + eventid;
                deleteStatement.executeUpdate(deleteSQL);
                deletedCount++;
                System.out.println(deletedCount);
            }
       System.out.println("Completed Delete! "+ deletedCount +" deleted!");
    } catch (SQLException e) {
        throw new IllegalStateException("Cannot connect the database!", e);
    }

我在这里所做的是首先选择日期已经过去的所有项目并将其设置为结果集。然后我通过一个while循环试图从数据库中删除它们。它运行一次并得到我将在下面完整说明的错误。每次通过循环时都需要创建一个新的删除语句吗?我想不出办法来正确地做到这一点。

这是完整的错误:

Connecting database for Delete...
Database connected!
1
Exception in thread "main" java.lang.IllegalStateException: Cannot connect the database!
at JDBC.deleteOverDueEvents(JDBC.java:56)
at EventJSON.main(EventJSON.java:31)
Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6313)
at JDBC.deleteOverDueEvents(JDBC.java:45)
... 1 more

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    为什么选择、循环和删除时

    String deleteSQL= "DELETE FROM table WHERE end <= (NOW() - INTERVAL 1 HOUR)";
    Statement deleteStatement = conn.createStatement();
    deleteStatement.executeUpdate(deleteSQL);
    

    工作效率更高

    【讨论】:

    【解决方案2】:

    当行

    deleteStatement.executeUpdate(deleteSQL);
    

    被执行,则ResultSet rs自动成为closed

    当 Statement 对象时,ResultSet 对象会自动关闭 生成它的对象被关闭、重新执行或用于检索下一个 多个结果的序列。


    但是你可以简单地通过运行来解决这个问题

    String deleteCmd = "DELETE FROM table WHERE end <= (NOW() - INTERVAL 1 HOUR)";
    int deletedCount = deleteStatement.executeUpdate(deleteCmd);
    

    而不是选择记录并删除每个记录。

    【讨论】:

      【解决方案3】:

      我认为这是因为您在循环到结果集时删除了该行并且您的逻辑完全错误。您选择所有带有“end

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 2012-06-11
        • 2017-04-17
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        相关资源
        最近更新 更多