我尝试从Firebird 2.5DB进行2次查询。我使用两个单独的语句对象,但是在第二个查询程序中尝试使用来自第一个查询的数据时,会得到一个错误:
java.sql.SQLException:结果集已关闭。
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"))
行中,我得到了错误
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)
发布于 2020-01-23 02:50:17
问题是,您正在自动提交的连接上执行两个语句。在自动提交模式下,执行语句时,其他语句创建的结果集将关闭.
如JDBC 4.3规范中所述,在第15.2.5节中关闭了一个ResultSet
对象
时,
ResultSet
对象隐式关闭。
Statement
对象被重新执行。ResultSet
是用CLOSE_CURSORS_AT_COMMIT
的可保持性创建的,并发生隐式或显式提交。使用Jaybird ( Firebird JDBC驱动程序),您有三个选项:
defaultResultSetHoldable
set,将Jaybird配置为默认使用可保留的结果集。另见默认可持结果集。设置此属性将影响所有语句和结果集。第一种选择比较可取。
顺便提一下,我强烈建议您开始使用试着用资源:您当前的代码容易受到资源泄漏的影响。
正如Kayaman的注释中所指出的,您应该考虑重写查询,因此它只是一个查询。您目前正在创建N+1查询问题(执行一条语句,然后对该语句的每一行执行另一条语句)。在查询中使用联接将允许您将其作为单个查询执行。作为警告,您的查询容易受到存储的SQL注入的影响,因为您将一个值连接到查询字符串中。
https://stackoverflow.com/questions/59873908
复制相似问题