9 Stimmen

Ergebnissatz nicht geöffnet. Überprüfen Sie, dass Autocommit ausgeschaltet ist. Apache Debry

Ich verwende Apache Derby für meine Datenbank. Ich bin in der Lage, Einfügungen in die Datenbank vorzunehmen. Es folgt ein Auszug aus dem Code, der versucht, den Inhalt meiner einzigen Tabelle "MAINTAB" anzuzeigen. Die Instanz von java.sql.Connection ist 'dbconn'.

    ResultSet word;

    Statement query;

    String getData="SELECT THEWORD FROM MAINTAB";
    try{
        System.out.println(dbconn.getAutoCommit());
        query = dbconn.createStatement();
        word = query.executeQuery(getData);
        query.close();

        dbconn.setAutoCommit(false);
        System.out.println(dbconn.getAutoCommit());

        for(;word.next();)
            System.out.println(word.getString(1));

    }catch(Throwable e){
        System.out.println("Table fetch failed or result data failed");}

Die Ausgabe sieht folgendermaßen aus.

org.apache.derby.jdbc.EmbeddedDriver loaded.
Database testDB connected
true
false
Table fetch failed or result data failed

---SQLException Caught---

SQLState:   XCL16
Severity: 20000
Message:  ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF.
java.sql.SQLException: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.newSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.checkIfClosed(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.getString(Unknown Source)
Closed connection
    at test.ShowData.main(ShowData.java:30)
Caused by: java.sql.SQLException: ResultSet not open. Operation 'getString' not permitted. Verify that autocommit is OFF.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(

Unknown Source)
    ... 9 more
Database shut down normally

Bei der ersten Abfrage, ob AUTOCOMMIT ausgeschaltet ist, habe ich in der Derby-Dokumentation herausgefunden, dass AUTOCOMMIT standardmäßig für jede Verbindung eingeschaltet ist. Also habe ich es mit dbconn.setAutoCommit(false) ausgeschaltet. Trotzdem wird der Fehler ausgelöst.

Die Ausgabe vor dem Fehler erklärt, dass die Ergebnismenge ohne Fehler abgerufen wurde. Beachten Sie bitte auch, dass derselbe Fehler auch dann auftritt, wenn ich AutoCommit nicht auf false setze. Zwischen, ich bin derby auf Eclipse ausgeführt.

17voto

dogbane Punkte 253146

Das Problem ist, dass Sie Ihre Anfrage geschlossen haben Ihre Ergebnisliste zu lesen. Wenn Sie die Abfrage schließen, wird auch die Ergebnismenge geschlossen, weshalb Sie die Fehlermeldung "ResultSet not open" erhalten. Sie sollten die Abfrage ganz am Ende schließen, in einer finally Block:

ResultSet word;

Statement query=null;

String getData="SELECT THEWORD FROM MAINTAB";
try{
    System.out.println(dbconn.getAutoCommit());
    query = dbconn.createStatement();
    word = query.executeQuery(getData);

    dbconn.setAutoCommit(false);
    System.out.println(dbconn.getAutoCommit());

    for(;word.next();)
        System.out.println(word.getString(1));

}catch(Throwable e){
    System.out.println("Table fetch failed or result data failed");
} finally{
    if(query!=null) {
        try {
             query.close();
        }
        catch(SQLException ex) {
              System.out.println("Could not close query");
        }
   }
}

0 Stimmen

Ja, es funktioniert jetzt! Ich danke Ihnen vielmals. Ich habe einen halben Tag lang gekämpft!

0 Stimmen

Ach so, ich verstehe das so: Das Schließen der Abfrage schließt die Ergebnismenge. Das war der Grund, warum der Fehler sagte, dass die Ergebnismenge nicht offen ist.

1voto

vikas kumar Punkte 9158

Bei mir war es das Connection-Objekt, das geschlossen wurde. Denken Sie also beim nächsten Mal daran, Ihr vorhandenes Connection-Objekt zu verwenden.

Stattdessen verwende ich dies jedes Mal, wenn ich eine neue Abfrage erstelle.

 private Connection getConnect() {
    try {
        return DriverManager.getConnection(Utils.getDatabaseConnection(), null);
    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }
}

und dann was auch immer mit der Nullprüfung für z.B. tun.

getConnect().createStatement();

0 Stimmen

In meinem Fall trat dieser Fehler auf, als ich einen neuen Thread zum Ausführen einer Abfrage verwendete, aber keine neue Verbindung einrichtete

0voto

Faisal Mushtaq Punkte 317

Sie können dies tun, indem Sie eine weitere Anweisungsvariable erstellen und diese mit con.createStatement() initialisieren;

Statement stmt = con.createStatement();
Statement stmt2 = con.createStatement();
stmt.executeQuery(" your first query goes here ");
stmt2.executeQuery("your second query goes here");

Ausführen einer zweiten Abfrage mit einer zweiten Statement-Variablen. Eine Lösung für Anfänger.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X