2013-02-19 144 views
8

我的代碼拋出java.sql.sqlRecoverableException:關閉聲明:下一

java.sql.sqlRecoverableException: Sentencia cerrada: next 

其中,英語,我想這將是:

java.sql.sqlRecoverableException: Closed statement: next 

這是我的代碼:

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()]); 

}

我可能會做的任何線索錯了嗎?我在Code Ranch上看到了兩個關於類似問題的主題,但他們都沒有爲我的案例提供解決方案。

+0

你的英語很不錯,但爲什麼西班牙語的代碼? :) – adarshr 2013-02-19 13:03:05

+3

請參閱下面的@EricGalluzzo的答案。爲了將來的參考,這種行爲記錄在[Javadoc](http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html)中 - 「ResultSet對象在生成它的Statement對象關閉,重新執行或用於從多個結果序列中檢索下一個結果。 – Perception 2013-02-19 13:05:33

+1

@adarshr感謝您的讚美。我是西班牙人,我在西班牙工作。我們通常使用我們國家的語言撰寫評論。 – Josep 2013-02-19 13:10:29

回答

17

您正在從結果集中檢索信息之前關閉語句。在rs.next()循環後移動stmt.close()呼叫(但保留try/finally)。

+0

它的工作原理!但爲什麼我應該保留「finally」塊,如果它不再包含任何語句? – Josep 2013-02-19 13:06:34

+2

你應該把rs.next()放在主try塊內,然後在finally塊中保留'stmt.close()'。 – 2013-02-19 13:07:57

2

由於固定代碼不適合發表評論,因此我在此發佈以供將來參考。

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()]); 
}