2013-02-19 14 views
8

私のコードは英語で、私はそれがだろうと思い、java.sql.sqlRecoverableException:クローズされたStatement:次

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

}

私が何をしているかの手掛かり間違っている?私はコード牧場で同様の問題について2つのスレッドを見てきましたが、それらのどれも私の場合の解決策を提示していないようでした。

+0

あなたの英語はかなり良いですが、なぜスペイン語のコードですか? :) – adarshr

+3

下記の@EricGalluzzoからの回答をご覧ください。将来の参照のため、この動作は[Javadoc](http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html)に記載されています。 - 'ResultSetオブジェクトは自動的に閉じられます。それを生成したStatementオブジェクトは閉じられ、再実行され、複数の結果のシーケンスから次の結果を取得するために使用されます。 – Perception

+1

@adarshr褒めてくれてありがとう。私はスペイン語で、私はスペインで働いています。私たちは通常、私たちの国の言葉でコメントを書いています。 – Josep

答えて

17

結果セットから情報を取得する前に、文をクローズしています。 rs.next()ループの後にstmt.close()コールを移動します(ただしtry/finallyを保持します)。

+0

それは動作します!しかし、なぜそれがもはやステートメントを含んでいない場合、私は "最終的に"ブロックを保持する必要がありますか? – Josep

+2

メインのtryブロックの中に 'rs.next()'を入れ、finallyブロックに 'stmt.close()'を置いてください。 –

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()]); 
} 
関連する問題