Dies kann verschiedene Ursachen haben, einschließlich des von Ihnen verwendeten Treibers.
a) Einige Treiber erlauben keine verschachtelten Anweisungen. Abhängig davon, ob Ihr Treiber JDBC 3.0 unterstützt, sollten Sie beim Erstellen des Statement-Objekts den dritten Parameter überprüfen. Zum Beispiel hatte ich das gleiche Problem mit dem JayBird-Treiber für Firebird, aber der Code funktionierte gut mit dem Postgres-Treiber. Dann fügte ich dem Aufruf der createStatement-Methode den dritten Parameter hinzu und setzte ihn auf ResultSet.HOLD_CURSORS_OVER_COMMIT, und der Code funktionierte auch für Firebird einwandfrei.
static void testNestedRS() throws SQLException {
Connection con =null;
try {
// GET A CONNECTION
con = ConexionDesdeArchivo.obtenerConexion("examen-dest");
String sql1 = "select * from reportes_clasificacion";
Statement st1 = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
ResultSet rs1 = null;
try {
// EXECUTE THE FIRST QRY
rs1 = st1.executeQuery(sql1);
while (rs1.next()) {
// THIS LINE WILL BE PRINTED JUST ONCE ON
// SOME DRIVERS UNLESS YOU CREATE THE STATEMENT
// WITH 3 PARAMETERS USING
// ResultSet.HOLD_CURSORS_OVER_COMMIT
System.out.println("ST1 Row #: " + rs1.getRow());
String sql2 = "select * from reportes";
Statement st2 = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// EXECUTE THE SECOND QRY. THIS CLOSES THE FIRST
// ResultSet ON SOME DRIVERS WITHOUT USING
// ResultSet.HOLD_CURSORS_OVER_COMMIT
st2.executeQuery(sql2);
st2.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs1.close();
st1.close();
}
} catch (SQLException e) {
} finally {
con.close();
}
}
b) Es könnte einen Fehler in Ihrem Code geben. Denken Sie daran, dass Sie das Statement-Objekt nicht erneut verwenden können. Sobald Sie eine Abfrage für dasselbe Anweisungsobjekt erneut ausführen, werden alle geöffneten Resultsets, die der Anweisung zugeordnet sind, geschlossen. Stellen Sie sicher, dass Sie die Anweisung nicht schließen.
Fügen Sie eine Auflistung Ihres Codes hinzu. – JeeBee