2009-06-10 7 views
0

私はクライアントが特定のデータソースからデータを取得するために使用できるクラスを作成することを任されています。例えば、メインルーチンが開いているDataReaderをどのように追跡する必要がありますか?

IDataReader GetDataReader(DbCommand command); 
DataSet GetDataSet(DbCommand command); 

になります私は、データアクセスアプリケーションブロックがこれを行うことを知っているが、私は説明しません理由のためにアプリケーションブロックを使用することはできません。とにかく、私はいくつかの論理を借りるつもりです。

しかし、私の仕事のもう1つの部分は、開いているDataReaderを追跡することです。これは誰もが読者を適切に閉じていることを確認するだけのことです。私の計画は、GetDataReaderルーチンが呼び出されるたびに追加される、この新しいクラスの内部にDataReaderのコレクションを持つことだけでした。アプリケーションの実行が終了すると、コードはこのコレクションを通過し、まだ​​開いている各リーダーのファイルに警告を記録します。

だから、私は2つの質問を持っている:

  1. は、この設計で、本質的に間違っているものはありますか?
  2. DataReaderからSQLコマンドを実行することはできますか?これにより、クローズされていないリーダーの検索が大幅に簡略化されます。または、この情報を取得するためにリーダー/コマンドのペアを格納する必要がありますか?
+0

重複:http://stackoverflow.com/questions/941126/how-to-manage-sqldatareaders-in-a-data-access-layer – scottm

答えて

2

ルールを適用するためにデータアクセスコンポーネントのレベルを少し上げることを検討しましたか?たとえば、get-in-get-your-data-and-get-out-and-closeポリシーを適用するには、データアクセスコンポーネントのデータセットとスケーラのみを返します(ストアドプロシージャを使用するなど、データベースと対話する)。発信者が本当にデータだけを必要とし、データリーダーがそれほど必要でない場合は、おそらくリーダーからデータを読み取り、それを閉じてリーダーの状態を追跡する必要はありません。

生のリーダーを返すのではなく、DataReaderを返すための技術的な必要がある場合は、ラッパークラスまたはリーダーのサブクラスを作成して代わりに返すことができます。例えばTrackedDataReader。あなたはその本自体をクラスそのものの中に入れておくことができます。ちょっとした考え。

+0

DataReadersとDataSetsの両方を柔軟に取得する必要があります。あなたのTrackedDataReaderが何を意味するのか分かりません。与えられた読者の集まりは、本自体を保つものです。私たちも同じことを言っていると思います。 – bsh152s

関連する問題