【问题标题】:Passing ResultSet to other method [duplicate]将ResultSet传递给其他方法[重复]
【发布时间】:2016-08-07 09:27:48
【问题描述】:

我有一个从数据库获取数据并创建 excel 的应用程序。我想分离从 db 获取结果集的 dao 类和使用此结果集创建 excel 的类。

通过这种方式,我将 ResultSet 从 Dao 传递给其他类以创建 excel 文件。但是当我运行 rs.next() 时,它给了我“关闭的结果集:下一个”错误。 我在互联网上读到传递 ResultSet 不是一个好主意,因此我只是尝试在 dao 类中这样做并且它有效。

但是这样我不喜欢在 dao 类中做其他任务(创建 excel),我不想创建一个类然后将它们作为列表发送。所以我的问题是为什么将结果集传递给其他类或函数是不好的?为什么我通过它并尝试调用 rs.next() 时出现异常?

总结一下我的代码如下:

ResultSet rs = myDao.getResult();
ExcelCreator excelCreator = new ExcelCreator();
excelCreator.createExcel(rs);

【问题讨论】:

  • 检查是否在你的 DAO 类中关闭连接,因为关闭连接也可能导致关闭 ResultSet

标签: java oracle resultset


【解决方案1】:

因为强制打开连接可能导致资源泄漏,关闭连接导致关闭结果集。因此我们使用对象的集合来返回它。

【讨论】:

    【解决方案2】:

    为什么您会收到“关闭的结果集:下一个”错误,请参见此处:

    Why am I getting ResultSet is closed error when I never closed any

    我想你没有使用像 Hibernate 这样的 ORM 框架。

    在这种情况下,映射 DAO 中的结果集数据或自己构建一个对象映射器,将 ResultSet 映射到某个数据传输对象。然后将此对象传递给 createExcel() 方法。

    类似这样的:

    ResultSet rs = myDao.getResult();
    List<ExcelDto> excelDtos = new ArrayList<>();
    ExcelDto excelDto;
    while (rs.next()) {      
        excelDto = new ExcelDto();    
        dto.setXCol(rs.getString("XColumn"))
        excelDtos.add(dto);  
    }
    excelCreator.createExcel(excelDtos);
    

    然后在 excelCreator 中,您可以使用 ArrayList 而不是 ResultSet。

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 2011-02-19
      相关资源
      最近更新 更多