正在读取ResultSet:java.sql.SQLException:关闭ResultSet后不允许执行操作

正在读取ResultSet:java.sql.SQLException:关闭ResultSet后不允许执行操作,java,mysql,jdbc,resultset,sqlexception,Java,Mysql,Jdbc,Resultset,Sqlexception,我正在尝试从MySQL数据库获取信息。我可以很好地连接并执行诸如向表中插入数据之类的操作,尽管我收到了一个结果集,但我无法读取它。这是我的密码: public ResultSet executeQuery(String query) { Statement stmt = null; ResultSet rs = null; try { stmt = conn.createStatement(); rs = stmt.executeQuer

我正在尝试从MySQL数据库获取信息。我可以很好地连接并执行诸如向表中插入数据之类的操作,尽管我收到了一个结果集,但我无法读取它。这是我的密码:

public ResultSet executeQuery(String query) {
    Statement stmt = null;
    ResultSet rs = null;

    try {
        stmt = conn.createStatement();
        rs = stmt.executeQuery(query);

        if (stmt.execute(query)) {
            rs = stmt.getResultSet();
        }
        return rs;
    }
    catch (SQLException ex){
        System.err.println("SQLException: " + ex.getMessage());
        System.err.println("SQLState: " + ex.getSQLState());
        System.err.println("VendorError: " + ex.getErrorCode());
    }
    finally {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException sqlEx) { } // ignore

            stmt = null;
        }
    }
    return null;
}
正在尝试读取结果集:

我得到这个错误:

java.sql.SQLException:结果集关闭后不允许操作


我整天都在网上和不同的论坛上浏览。我的代码怎么了?

在迭代结果之前,executeQuery中的finally块将关闭语句。

TL;DR Your executeQuery关闭语句。 从

释放此语句对象的数据库和JDBC资源 立即,而不是等待它发生时 自动关闭

在阅读结果集之前,请先关闭语句。关闭语句会导致与该语句关联的所有ResultSet实例也被关闭

您需要将a传入另一个方法,并在语句打开时处理结果集:

我还修复了您的代码:

我已经取代了你的尝试…最后是一次资源尝试 通过调用stmt.executequery和stmt.executequery执行查询两次。这不仅是浪费,而且会丢失对第一个ResultSet和if语句的引用。close没有关闭所有关联的ResultSet,否则会导致内存泄漏。 嗯,有两件事-

1我不明白为什么您的方法中同时包含execute和executeQuery?我认为行政部门应该为你工作


2在遍历resultset之前不要关闭语句。将其设为实例变量,并在迭代后将其关闭。

除非我弄错了,否则每次在finally语句中都将其关闭
ResultSet set = executeQuery("SELECT rank FROM players");
try {
    while(set.next()) {
          System.out.println(set.getInt("rank") + "");
    }
} catch(Exception ex) {
    ex.printStackTrace();
} finally {
    try {
        set.close();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
}
public void executeQuery(final String query, final Consumer<ResultSet> consumer) {
    try(final Statement stmt = conn.createStatement();
        final ResultSet rs = stmt.executeQuery(query)) {
            consumer.accept(rs);
    }
    catch (SQLException ex){
        System.err.println("SQLException: " + ex.getMessage());
        System.err.println("SQLState: " + ex.getSQLState());
        System.err.println("VendorError: " + ex.getErrorCode());
    }
}