【问题标题】:java.sql.SQLException: Operation not allowed after ResultSet closed MySQL Java [duplicate]java.sql.SQLException:ResultSet关闭MySQL Java后不允许操作[重复]
【发布时间】:2013-03-23 12:16:04
【问题描述】:

每当我尝试使用此方法时,我都会收到此问题。

java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:794)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7077)
    at server.util.Plimus$1.run(Plimus.java:77)

这是第 77 行:while (resultSet.next()) {

public static void process(final Player c, final String playerName) {
    if (connection == null && connectionStatus == 0)
        createConnection();
    else if (connectionStatus != 0)
        return;
    new Thread() {
        @Override
        public void run() {
            try {
                String username = playerName.replaceAll(" ", "_");
                String query = "SELECT * FROM donations WHERE username = '" + username + "' AND received = '0' LIMIT 1;";
                ResultSet resultSet = query(query);
                while (resultSet.next()) {
                    int[] contractIds = {3178768, 1}; //put all of your contract ids in here.
                    int contractId = Integer.parseInt(resultSet.getString("contract")), id = Integer.parseInt(resultSet.getString("id"));
                    query("UPDATE donations SET received = '1' WHERE username = '" + username + "' AND id = '" + id + "';");
                    if (contractId == contractIds[0]) { //first contract id in array.
                        c.getItems().addItem(962, 1);
                    } else if (contractId == contractIds[1]) { //second contract id in array.
                        c.getItems().addItem(962, 1);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                processMethod(0, true, true, false);
            }
        }
    }.start();
}

这是请求的查询方法。

/**
 * Creates query function.
 */
public static ResultSet query(String s) throws SQLException {
    try {
        if (s.toLowerCase().startsWith("select")) {
            ResultSet resultSet = statement.executeQuery(s);
            return resultSet;
        } else {
            statement.executeUpdate(s);
        }
        return null;
    } catch (Exception e) {
        e.printStackTrace();
        processMethod(0, true, true, false);
    }
    return null;
}

【问题讨论】:

  • 你在哪一行得到这个异常?
  • 还有post查询方法
  • 查询方法有什么作用?
  • 它会更新我数据库中的信息。
  • 一个名为query的变量和一个名为query的方法在同一范围内。现在这是个好主意。

标签: java mysql resultset sqlexception


【解决方案1】:

在遍历您的 ResultSet 时,您正在重用 Statement 对象来更新数据(在您的 query 方法中),这会从查询中关闭 ResultSet

ResultSet documentation

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

您应该为查询和更新创建单独的语句,并将它们传递给您的查询方法:

public ResultSet query(String s, Statement statement) throws SQLException {
    ...
}

我假设 statement 在您的类中声明为 static - 通常不需要这样做:在您的类的构造函数中创建用于查询和更新的两个语句,然后将它们传递给 query()方法或根据语句使用一种或另一种。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2011-12-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多