【问题标题】:Why the ResultSet is closed?为什么 ResultSet 是关闭的?
【发布时间】:2022-02-02 13:35:15
【问题描述】:

我正在努力解析从 SQLite 数据库获取的元素,但抛出异常“ResultSet is closed”。之前我对所有查询都使用了一个语句,但我知道它会导致问题,所以我在本地创建了语句。我仍然遇到同样的错误。

private Book parseBook(ResultSet result) throws SQLException {
    return new Book(result.getString(1), result.getString(2), result.getString(3), 
            LocalDate.parse(result.getString(4)), result.getString(5), result.getString(6));
}

@Override
public Book getBook(String id) throws SQLException {
    statement = conn.createStatement();
    String sql = String.format(selectBooks, id);
    ResultSet result = statement.executeQuery(sql);
    return parseBook(result);
}

在 Main 中调用 getBook() 函数:Book data = sqlDAO.getBook(args[1]);

这是完整的错误信息:

java.sql.SQLException: ResultSet closed
at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69)
at org.sqlite.core.CoreResultSet.markCol(CoreResultSet.java:96)
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:436)
at library.LibrarySQLDAO.parseBook(LibrarySQLDAO.java:37)
at library.LibrarySQLDAO.getBook(LibrarySQLDAO.java:82)
at library.Main.main(Main.java:195)

Process finished with exit code 0

我看到过同样错误的帖子,但总的来说,我看到的问题是错误地重复使用了一个语句。请给我一个提示,我做错了什么。

【问题讨论】:

  • 你需要发布parseBook并注明第37行
  • @SharonBenAsher 你是什么意思?
  • 堆栈跟踪指定异常发生在 parseBook 方法内部,在第 37 行。所以显示该方法的源代码并指向我们的行号。

标签: java jdbc


【解决方案1】:

在获取列值之前,您需要调用result.next()(即使是第一行)

private Book parseBook(ResultSet result) throws SQLException {
    if (result.next()) {
        return new Book(result.getString(1), result.getString(2), result.getString(3), 
            LocalDate.parse(result.getString(4)), result.getString(5), result.getString(6));
    }
    return null; // return empty book?
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多