[我尝试从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)
问题是,您正在自动提交的连接上执行两个语句。在自动提交模式下,当您执行一条语句时,其他语句创建的结果集将关闭。
如JDBC 4.3 specification中第15.2.5节中所述关闭ResultSet
对象:
]隐式关闭
ResultSet
对象>
- 关联的
Statement
对象被重新执行- [
ResultSet is created with a Holdability of
CLOSE_CURSORS_AT_COMMIT`并且发生隐式或显式提交]使用Jaybird(Firebird JDBC驱动程序),您有三个选择:
在执行语句之前禁用自动提交:
conn.setAutoCommit(false);
通过执行为],使第一条语句在提交时可保留。
Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
(这将导致生成的结果集在(自动)提交后保持打开状态。但是请注意,在这种模式下,Jaybird将获取整个结果集在内存中,而不是分批获取它。
defaultResultSetHoldable
集,将Jaybird配置为默认使用可保存的结果集。另请参阅Default holdable result sets。首选第一个选项。