firebird2.5 DB中的java.sql.SQLException

问题描述 投票:0回答:1

[我尝试从firebird 2.5 DB进行2个查询,我使用2个单独的Statement对象,但是在第二个查询程序中尝试使用第一个查询的数据时,会收到错误java.sql.SQLException: The result set is closed.

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();
            }

在System.out.println(“Врач:” + rs.getString(“ STUDY_MD”))行中((rs2.next())时出现错误

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)
java jdbc firebird jaybird
1个回答
0
投票

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

JDBC 4.3 specification中第15.2.5节中所述关闭ResultSet对象

]隐式关闭ResultSet对象>

  • 关联的Statement对象被重新执行
  • [ResultSet is created with a Holdability of CLOSE_CURSORS_AT_COMMIT`并且发生隐式或显式提交]

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

  1. 在执行语句之前禁用自动提交:

    conn.setAutoCommit(false);
    
  2. 通过执行为],使第一条语句在提交时可保留。

    Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
    
  3. (这将导致生成的结果集在(自动)提交后保持打开状态。但是请注意,在这种模式下,Jaybird将获取整个结果集在内存中,而不是分批获取它。

  4. 类似于上一个选项,您可以通过指定连接属性defaultResultSetHoldable集,将Jaybird配置为默认使用可保存的结果集。另请参阅Default holdable result sets
  5. 首选第一个选项。

© www.soinside.com 2019 - 2024. All rights reserved.