Java JDBC 结果集已关闭

标签 java sql sqlite jdbc

运行此代码时,我收到 ResultSet 关闭错误。调用的方法和数据如下:

日志输出:

[2014-05-05 22:34:09.169 Debug] select count(*) as total from companies
[2014-05-05 22:34:09.170 Debug] ResultSet closed

方法:

public static Boolean recordsExist(String string, Connection c) {
    try {
        String[] query = string.split("\\*");
        String sql = "select count(*) as total" + query[1];
        ResultSet resultset = queryDB(sql, c);
        resultset.next();
        int count = resultset.getInt(1);
        Log.debug(Integer.toString(count));
        resultset.close();
        if (count > 0) {
            Log.debug("recordsExist returning true");
            return true;
        } else {
            Log.debug("recordsExist returning false");
            return false;
        }

    } catch (Exception e) {
        Log.debug(e.getMessage());
        return false;
    }
}

public static ResultSet queryDB(String sql, Connection c) throws SQLException {
    Log.debug(sql);
    Statement s = c.createStatement();
    ResultSet resultset = s.executeQuery(sql);
    s.close();
    return resultset;
}

指定的 SQL 字符串:

select * from companies

最佳答案

来自Java API :

Note:When a Statement object is closed, its current ResultSet object, if one exists, is also closed.

在关闭Statement之前,您需要处理ResultSet中的数据。沿着这些思路的东西应该有效:

public static Boolean recordsExist(String string, Connection c) {
    try {
        String[] query = string.split("\\*");
        String sql = "select count(*) as total" + query[1];
        return queryDB(sql, c);


    } catch (Exception e) {
        Log.debug(e.getMessage());
        return false;
    }
}

public static boolean queryDB(String sql, Connection c) throws SQLException {
    Log.debug(sql);
    Statement s = c.createStatement();
    ResultSet resultset = s.executeQuery(sql);
    boolean result = processResult(resultset);
    s.close();
    return result;
}

public static boolean processResult(ResultSet resultset) {
    resultset.next();
    int count = resultset.getInt(1);
    Log.debug(Integer.toString(count));
    resultset.close(); 
    if (count > 0) {
        Log.debug("recordsExist returning true");
        return true;
    } else {
        Log.debug("recordsExist returning false");
        return false;
    }

}

我还会考虑添加更多错误处理,以确保不会泄漏资源。例如,如果处理结果时发生异常,那么您的语句将无法正确关闭。

关于Java JDBC 结果集已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486847/

相关文章:

java - 在 Android 中的演示版和完整版之间共享保存游戏

java - Spring 表单处理,将实体映射到表单输入

sql更新查询

database - 将 SQLite 数据库提取到特定行的文本字段中

c++ - 如何强制 g++ 链接器加载不直接调用的符号 - 避免 undefined reference

sqlite - 将日期时间转换为日期时,为什么SQLite3仅返回年份而不返回完整日期?

java - Hibernate + Postgres 表和列名敏感问题

java - 如何在没有分块响应的纯 Java 项目中发送 Play Framework 中的 InputStream?

php - SQL 从历史记录中返回第一个记录日期

sql - 如何从 Oracle 中获取格式化的 XML