すでにたくさんの良い答えがあるにもかかわらず、まだ答えがマークされていないのを見て、私も2ビット追加すると思いました.
DataReaders はかなり高速なので、私は DataReaders を使用します (パフォーマンスがあなたのものであるか、できるだけ多くが必要な場合)。私が取り組んできたほとんどのプロジェクトでは、各テーブルに数百万のレコードがあり、パフォーマンスが懸念されます。
DataReader を複数のレイヤーにまたがって送信するのは得策ではないと言う人もいます。「DbDataReader」は技術的にデータベースに関連付けられていない(または関連付ける必要がない)ため、個人的にはこれを問題とは考えていません。つまり、データベースを必要とせずに DbDataReader のインスタンスを作成できます。
これを行う理由は次のとおりです。 (Web アプリケーションで) 頻繁に、Html、Xml、JSON、またはその他のデータ変換を生成しています。では、なぜ DaraReader から POCO オブジェクトに移動して、それを XML または JSON に変換してネットワークに送信するのでしょうか。この種のプロセスでは、通常、3 つの変換とオブジェクトのインスタンス化のブート ロードが必要であり、それらをほぼ瞬時に破棄します。
場合によっては、それでいい場合や仕方がない場合もあります。通常、私のデータ レイヤーは、システム内にあるストアド プロシージャごとに 2 つのメソッドを表示します。1 つは DbDataReader を返し、もう 1 つは DataSet/DataTable を返します。DataSet/DataTable を返すメソッドは、DbDataReader を返すメソッドを呼び出してから、DataTable の "Load" メソッドまたはアダプターを使用してデータセットを埋めます。おそらく、何らかの方法でデータを再利用する必要があるか、別のクエリを起動する必要があり、MARS が有効になっていない限り、DbDataReader を開いて別のクエリを起動することができないため、DataSet が必要になることがあります。
現在、DbDataReader または DataSet/DataTable の使用にはいくつかの問題があります。これは通常、コードの明確さ、コンパイル時のチェックなどです。データリーダーにはラッパー クラスを使用でき、実際には DataReader を IEnumerable で使用できます。本当にクールな能力。したがって、強力なタイピングとコードの可読性が得られるだけでなく、IEnumerable も得られます。
したがって、クラスは次のようになります。
public sealed class BlogItemDrw : BaseDbDataReaderWrapper
{
public Int64 ItemId { get { return (Int64)DbDataReader[0]; } }
public Int64 MemberId { get { return (Int64)DbDataReader[1]; } }
public String ItemTitle { get { return (String)DbDataReader[2]; } }
public String ItemDesc { get { if (DbDataReader[3] != DBNull.Value) return (String)DbDataReader[3]; else return default(String); } }
public DateTime ItemPubdate { get { return (DateTime)DbDataReader[4]; } }
public Int32 ItemCommentCnt { get { return (Int32)DbDataReader[5]; } }
public Boolean ItemAllowComment { get { return (Boolean)DbDataReader[6]; } }
public BlogItemDrw()
:base()
{
}
public BlogItemDrw(DbDataReader dbDataReader)
:base(dbDataReader)
{
}
}
DataReader ラッパー
私はブログ記事 (上記のリンク) でさらに詳しく説明しています。これらおよびその他の DataAccess レイヤー コードのソース コード ジェネレーターを作成する予定です。
DataTable にも同じ手法を使用できます (コード ジェネレーターがコードを生成します) ので、VS.NET がすぐに提供するオーバーヘッドなしで、厳密に型指定された DataTable として扱うことができます。
ラッパー クラスのインスタンスは 1 つしかないことに注意してください。したがって、クラスを破棄するためだけにクラスのインスタンスを何百も作成することはありません。