首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >java.sql.SQLException:当执行两个语句时,结果集在Firebird上关闭

java.sql.SQLException:当执行两个语句时,结果集在Firebird上关闭
EN

Stack Overflow用户
提问于 2020-01-23 00:03:27
回答 1查看 946关注 0票数 1

我尝试从Firebird 2.5DB进行2次查询。我使用两个单独的语句对象,但是在第二个查询程序中尝试使用来自第一个查询的数据时,会得到一个错误:

java.sql.SQLException:结果集已关闭。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
conn = DriverManager.getConnection(
                    strURL,
                    strUser, strPassword);

if (conn == null) {
    System.err.println("Could not connect to database");
}

Statement stmt = conn.createStatement();
Statement statement = conn.createStatement();

ResultSet rs = stmt.executeQuery(strSQL);
ResultSet rs2 = null;

try {
    while (rs.next()) {
        String strSQL2 = "SELECT PATIENT_NAME_R, PATIENT_DOB, PATIENT_ID, PATIENT_SEX, PATIENT_ADDRESS_CITY, PATIENT_ADDRESS_SHF FROM PATIENTS WHERE PATIENT_UID = " + rs.getObject(1);
        rs2 = statement.executeQuery(strSQL2);
        try {
            while (rs2.next()) {
                System.out.println("СПРАВКА");
                System.out.println("Ф.И.О.: " + rs2.getObject(1).toString().trim() + " Дата рождения: " + rs2.getObject(2));
                System.out.println("СНИЛС: " + rs2.getObject(3));
                System.out.println("Адрес: " + rs2.getObject(5) + " " + rs2.getObject(6));
                System.out.println("Врач: " + rs.getString("STUDY_MD"));
                System.out.println("----------------------------------------------------------------");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}

while (rs2.next())中的System.out.println("Врач: " + rs.getString("STUDY_MD"))行中,我得到了错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.sql.SQLException: The result set is closed
    at org.firebirdsql.jdbc.AbstractResultSet.checkOpen(AbstractResultSet.java:297)
    at org.firebirdsql.jdbc.AbstractResultSet.getField(AbstractResultSet.java:788)
    at org.firebirdsql.jdbc.AbstractResultSet.getString(AbstractResultSet.java:844)
    at sample.Main$MedicalCert.run(Main.java:156)
    at java.lang.Thread.run(Thread.java:748)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-23 02:50:17

问题是,您正在自动提交的连接上执行两个语句。在自动提交模式下,执行语句时,其他语句创建的结果集将关闭.

JDBC 4.3规范中所述,在第15.2.5节中关闭了一个ResultSet对象

时,ResultSet对象隐式关闭。

  • 关联的Statement对象被重新执行。
  • ResultSet是用CLOSE_CURSORS_AT_COMMIT的可保持性创建的,并发生隐式或显式提交。

使用Jaybird ( Firebird JDBC驱动程序),您有三个选项:

  1. 在执行语句之前禁用自动提交: Conn.setAutoCommit(假);
  2. 通过执行以下命令,使第一条语句在commit上保持有效 语句stmt = conn.createStatement( ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY,ResultSet.HOLD_CURSORS_OVER_COMMIT); 这将导致生成的结果集在(自动)提交后保持打开。但是要注意,在这种模式下,Jaybird将在内存中获取整个结果集,而不是分批获取结果集。
  3. 与前面的选项类似,您可以通过指定connection属性defaultResultSetHoldable set,将Jaybird配置为默认使用可保留的结果集。另见默认可持结果集。设置此属性将影响所有语句和结果集。

第一种选择比较可取。

顺便提一下,我强烈建议您开始使用试着用资源:您当前的代码容易受到资源泄漏的影响。

正如Kayaman的注释中所指出的,您应该考虑重写查询,因此它只是一个查询。您目前正在创建N+1查询问题(执行一条语句,然后对该语句的每一行执行另一条语句)。在查询中使用联接将允许您将其作为单个查询执行。作为警告,您的查询容易受到存储的SQL注入的影响,因为您将一个值连接到查询字符串中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59873908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文