2010-10-29 61 views
9

J'utilise apache derby pour ma base de données. Je suis capable d'effectuer des insertions dans la base de données. Ce qui suit est l'extrait du code qui tente d'afficher le contenu de ma seule table 'MAINTAB'. L'instance de java.sql.Connection est 'dbconn'.Resultset pas ouvert. Vérifiez que l'autorisation automatique est désactivée. Apache Debry

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

Et ce qui suit est la sortie.

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 

Quand il a demandé d'abord de vérifier si AUTOCOMMIT est OFF, j'ai trouvé de la documentation Derby que AUTOCOMMIT est activé par défaut à toute connexion. Donc, je l'ai désactivé en utilisant dbconn.setAutoCommit (false). Pourtant, l'erreur est levée.

La sortie avant l'erreur explique que l'ensemble de résultats a été récupéré sans erreur. Notez également que la même erreur est renvoyée même si je ne mets pas l'AutoCommit à false. Entre, je cours derby sur éclipse.

Répondre

15

Le problème est que vous avez fermé votre requête avant en lisant votre résultat. En fermant la requête, ferme le resultset, d'où l'erreur "ResultSet not open". Vous devriez fermer la requête à la fin, dans un bloc finally:

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

Oui, cela fonctionne maintenant! Merci beaucoup. Je luttais pour une demi-journée! – Sundeep

+0

Oh, donc, je comprends de cette façon - Fermeture de la requête, ferme le jeu de résultats. C'est pourquoi l'erreur a indiqué que le jeu de résultats n'est pas ouvert. – Sundeep