2013-02-19 8 views
8

mio codice generajava.sql.sqlRecoverableException: Chiuso dichiarazione: prossima

java.sql.sqlRecoverableException: Sentencia cerrada: next 

che, in inglese, credo che sarebbe:

java.sql.sqlRecoverableException: Closed statement: next 

Questo è il mio codice:

public TransactionArray() throws SQLException { 

    /* Obtenemos la tabla de transacciones. */ 
    Connection connection; 
    connection = ConnectionManager.getConnection(STATISTIC_DATA_BASE); 
    Statement stmt = null; 
    String query = 
      "select * " + 
      "from " + "dCellStatistic" + ".F_Transaction"; 
    ResultSet rs = null; 
    try { 
    stmt = connection.createStatement(); 
    rs = stmt.executeQuery(query); 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } finally { 
    if (stmt != null) { stmt.close(); } 
    } 

    /* Construimos las transacciones a partir de los registros. */ 
    List<Transaction> transactionList = new ArrayList<Transaction>(); 
    while (rs.next()) { //THE PROBLEM ARISES IN THIS LINE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    transactionList.add(new Transaction(rs)); 
    } 
    array = transactionList.toArray(new Transaction[transactionList.size()]); 

}

Eventuali indizi di ciò che potrei essere fare sbagliato? Ho visto due thread su Code Ranch su problemi simili, ma nessuno di loro sembrava fornire una soluzione per il mio caso.

+0

Il tuo inglese è abbastanza buono, ma perché il codice è in spagnolo? :) – adarshr

+3

Vedere la risposta di @EricGalluzzo di seguito. Per riferimento futuro, questo comportamento è documentato in [Javadoc] (http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html) - 'Un oggetto ResultSet viene automaticamente chiuso quando il L'oggetto Statement che lo ha generato viene chiuso, rieseguito o utilizzato per recuperare il risultato successivo da una sequenza di risultati multipli. – Perception

+1

@adarshr Grazie per il complimento. Sono spagnolo e lavoro in Spagna. Di solito scriviamo i commenti nella lingua del nostro paese. – Josep

risposta

17

Si sta chiudendo l'istruzione prima di recuperare le informazioni dal set di risultati. Spostare la chiamata stmt.close() dopo il ciclo rs.next() (ma mantenere la prova/finalmente).

+0

Funziona! Ma perché dovrei mantenere il blocco "finalmente" se non contiene più alcuna istruzione? – Josep

+2

Dovresti mettere il 'rs.next()' nel blocco try principale, e poi nel blocco finally, tieni il 'stmt.close()'. –

2

Poiché il codice fisso non rientra in un commento, lo pubblico qui per riferimento futuro.

public TransactionArray() throws SQLException { 
    List<Transaction> transactionList = new ArrayList<Transaction>(); 

    /* Obtenemos la tabla de transacciones. */ 
    Connection connection; 
    connection = ConnectionManager.getConnection(STATISTIC_DATA_BASE); 
    Statement stmt = null; 
    String query = 
      "select * " + 
      "from " + "dCellStatistic" + ".F_Transaction"; 

    /* Construimos las transacciones a partir de los registros. */ 
    ResultSet rs; 
    try { 
    stmt = connection.createStatement(); 
    rs = stmt.executeQuery(query); 
    while (rs.next()) { 
     transactionList.add(new Transaction(rs)); 
    } 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } finally { 
    if (stmt != null) { 
     stmt.close(); 
    } 
    } 
    array = transactionList.toArray(new Transaction[transactionList.size()]); 
}