0

Java では、ステートメントが閉じられると ResultSet にアクセスできませんが、フェッチされた少量のデータが何度も取得され、開いているように見えます。しかし、一般的には API 規則に違反しています。

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

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

1 に答える 1

1

これはまったくお勧めできません。なぜあなたはそれをするのですか?

Command が Disposed の場合 (これは、実行が using ブロックを離れたときに発生します)、接続は閉じられないため、おそらく DataReader を使い続けることができます。

ただし、これは非常に悪い考えです。

  • 外部コードに依存しているため、接続が閉じられることを確認できません。

  • これにより DB がロックされ、競合の問題が発生する可能性があります。

  • リーダーが使用する接続は「ビジー」のままであるため、再利用できません。

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

ただし、DataReader を長時間開いたままにしないでください。データリーダーは、できるだけ早く反復して閉じる必要があります。データを DataTables に転送して使用する際のオーバーヘッドを回避するために利用できます。つまり、DataGridView などのコントロールにバインドする場合、データを直接コントロールにバインドして、追加の処理時間とメモリを必要とする DataTable の中間使用を回避することができます (データから直接データを取得する代わりに、データをデータテーブルに変換してからコントロールに変換する)。制御するデータソース)。

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

于 2012-04-26T23:04:54.140 に答える