2012-04-26 5 views
0

Javaでは、Statementが閉じられた後にResultSetにアクセスすることはできませんが、しかし、一般的にAPIルールに反する。Commandが閉じられた後にOleDBDataReaderにアクセスするのは安全ですか

しかし、OLEDBでは、同じルールがコマンドとリーダーに適用されているのだろうかと思います。たとえば、次のコードは100%安全ですか?コマンドが破棄されてもSQLフェッチカーソルは開いたままになりますか?

public OleDbDataReader ExecuteReader(string sql, OleDbConnection connection) 
{ 
    using (OleDbCommand command = CreateCommand(sql, connection)) 
    { 
    return command.ExecuteReader(); 
    } 
} 

答えて

1

これはまったくお勧めしません。なぜあなたはそれをやりますか?

コマンドが破棄されると(実行が使用ブロックを離れるときに発生します)、接続は閉じられないため、おそらくDataReaderを使用し続けることができます。

しかし、これは非常に悪い考えです:

  • それが外部コードに依存しますので、あなたは、接続がクローズされることを確認してください得ることができません。

  • これは、DBにロックを入れることで、競合の問題が発生する可能性があります。

  • リーダーで使用されている接続が「ビジー」なので、再利用できません。

必ず読者と関連する接続が閉じていることを確認してください。この設計では、返されたDataReaderのユーザーがリーダーと接続を閉じるために依存する必要があります。または、読み取り側が閉じられたときに自動的に会議が終了するように、CloseConnectionを設定できるCommandBehaviorを受け取るSqlCommand.ExecuteReaderオーバーロードを使用する場合は、少なくともリーダーです。

しかし私は、DataReaderを長時間開いておくべきではないと主張しています。データウェアハウスはできるだけ早く反復処理して終了する必要があります。データをDataTableに転送する際のオーバーヘッドを避けることができます。私。 DataGridViewのようなコントロールにバインドすると、DataTableの中間使用を避けるようにコントロールに直接データをバインドすることができます。これにより、処理時間とメモリが余分に必要になります(データソースからのデータではなく、制御する)。

だから、おそらくあなたはそれを行うことができますが、確かに、あなたはすべきではありません!

+0

ありがとうございました。私は既存のコードを見直しています。アプローチを修正するためのいくつかの確固たる理由が必要でした。 –

関連する問題