2017-05-02 5 views
2

閉じたときに、私はこのような方法を持って空になっています。 私は衣類の準備が完了した行をコメントアウトすると、//selectQuery.close();すべてが問題ありません。 の後に結果セットに値を代入してを閉じます。なぜそれは空ですか?ResultSetが、私はPreparedStatementの

+0

これは、おそらくクエリの終了によって閉じられるためです。あなたはResultSetを返すべきではなく、それらを "インプレース"で使用し、 –

+0

を処分するべきです:https://stackoverflow.com/questions/1039419/when-to-close-connection-statement-preparedstatement-and-resultset-in-jdbc ?rq = 1 –

答えて

1

ResultSetは実行済みStatementに関連付けられています。ステートメントと結果セットを閉じ、その中のデータをクリアします。

ステートメントを閉じる前に結果セットを処理する必要があるため、アプローチが機能しません。

1

javadocがそう言うので:

注:Statementオブジェクトが閉じて、ResultSet objectその電流を1が存在する場合にも、閉じられています。

理論的根拠:Statement.close()の動作は、すべてのリソースを解放することです。これらのリソースの1つは、結果を読み取るためのサーバー側のカーソルです。しかし、あなたがそれを解放すれば、ResultSetはデータを引き出すことができません。

(閉鎖された)ResultSetがどのように「空」であると判断しているのか不思議です。閉じたResultSetのすべての操作(close()を除く)は例外をスローするはずです。

1

結果セットのデータを取得する前にステートメントを閉じる必要はありません。そうしないと、アクセスできない可能性があります。
このメソッドを呼び出すと、そのResultSetオブジェクトは閉じられます。

したがって、ステートメントの使用が終了したときにのみStatement.close()メソッドを呼び出します。

最後の文で閉じる必要があります。
このようにして、閉じるときに心配する必要がなくなります。あなたの実際のコードでは

private static ResultSet select (Connection connection, String query) { 
     PreparedStatement selectQuery = null; 
     ResultSet resultSet = null; 
     try { 
      selectQuery = connection.prepareStatement(query); 
      resultSet = selectQuery.executeQuery(); 
     } catch (SQLException e) { 
      System.out.println(e); 
     } 
     finally { 
      if (selectQuery != null) { selectQuery.close(); } 
     } 
     return resultSet; 
    }  
} 

より良い代替手段は、try-と、リソース文を使用している:

try (Statement stmt = con.createStatement()) { 
    // ... 
} 
1

あなたがResultSetを繰り返し処理する必要があります。上位レベルの例がここにあります:

try{ 
    // execute the query 
    ResultSet rs = st.executeQuery(query); 

    // iterate through the result set 
    while (rs.next()) 
    { 
    // Replace with your data 
    int id = rs.getInt("id"); 
    String name = rs.getString("name"); 

    // do stuff with the result set, add to a List of objects (for example) 
    } 
    selectQuery.close(); 
}catch(SQLException e) { 
     System.out.println(e); 
} 
関連する問題