データベースからデータを取得する際に DataReader と DataAdapter を使用するときに考慮しなければならないことと、この 2 つの他の datareader の違いは何ですか?すべての DAL で、dataadapter を使用することはありません。したがって、DataReader を使用するよりも、DataAdapter + Datatable の組み合わせを使用する方が良いシナリオは何でしょうか。前もって感謝します。
7 に答える
DataReader : readony モードでデータをフェッチし、ビジネス エンティティにデータを入力してリーダーを閉じたい場合に最適です。これは本当に速いです。
たとえば、顧客クラスがあり、すべての顧客プロパティ (名前、住所など) が入力されたオブジェクトを完全に初期化したいとします。
ここでは DataReader を使用し、エンティティにデータを入力してリーダーを閉じます。
datareader では更新できません。
DataAdapter : dataadapters を使用してデータの読み取り/更新を行うことができますが、Datareader よりもデータの読み取り速度が遅くなります。
DataAdapter でデータを更新できますが、リーダーでは更新できません
DataReader
レコードごとに処理して捨てることができるため、互いに関係のない多数のデータ レコードを処理する場合に適しています。たとえばDataReader
、データベース内のすべてのレコードから複雑な統計値を計算する場合や、大量のデータ レコードをローカル ファイルに保存する場合に使用できます。
DataAdapter
それ以外の場合は、メモリにデータ レコードを保持できます。これにより、GUI でデータを閲覧したり、データを編集したりできます。より一般的ですが、大きなデータ セットではうまく機能しません。
DataSets を使用する場合は、DataAdapters のみを使用します。
アダプタには 2 つの主要なメソッドがFill()
ありUpdater()
、データベースからデータセットを読み取り、データベースに書き込みます。
Fill()
接続を開き、DataReader を使用してすべてのレコードを取得してから、接続を閉じることに注意してください。
Datasets と DataTables がなければ、DataAdapter を使用できません。
本当の問題は、DAL でどのような種類のストレージ クラスを使用するかということです。DataSet は実行可能でシンプルですが、古いテクノロジです (もはや改善されていません)。
ORM (Object Relational Mapping) ライブラリを探す必要があるかもしれません。しかし、それは DataReader/Adapter の質問をより複雑な選択肢に置き換えます。
ADO.NET を行うときも、ほとんどの場合 DataReader を好みます。その理由は、必要以上にクライアントにデータを保存する必要がないからです。
これは、DataAdapter を DataSet/Table に対していつ使用するかについての答えでもあります。クライアントにデータを保存したい場合、おそらく何らかの形でデータを操作する場合 - 単に値をグリッドに出力するのではなく、前後に繰り返したり、セットとして操作したりします。リーダー、IMO、より良いオプションです。
DataReader は使用しません。
私はアプリケーションを強力に階層化しているため、DAL はデータベースとの対話を担当し、BLL はオブジェクトの構築を担当しているため、BLL が完了時に DataReader を閉じる方法はありません。代わりに、BLL が DAL から DataSet/DataTable を要求し、DAL がそれを実行します。Fill を実行することでこれを行います (TomTom の要点 > スタック トレースを見ると、そこに DataReader が表示されます)。次に、BLL は結果セットに対して好きなことを行います。
DataReader と DataAdapter を使用する際に考慮すべきこと
DataReader: 優れた低レベル インターフェース。PRetty のほとんどが唯一のインターフェースです。データをより高い構造にロードする場合、実際のロードは常に DataReader を使用して行われます。
DataAdapter / DataSet: 構造化されたプログラムや優れたコードが好きで、たまたまレポート アプリケーションを作成しない人には使用されないもの。代わりに ORM を使用してください - NHipernate (良い)、Linq2SQL (悪い)、Entity Framework (悪い)、または他の優れた抽象化の 1 つ。
この質問は、procとconsについて話し、コードから離れていると思います
*データ リーダーは、データのフェッチにおいて DataAdapter よりもはるかに高速ですが、切断モードが正確に何であるかを知る必要があります
*DataReader または Connected モードと DataAdapter Disconnected モードは同じシナリオで使用されていますが、データの方法である場合は、Disconnected モードの方が優れている場合があります
*ただし、Disconnectiod モードには、DataAdapter、DataView、DataTable、DataSet などの豊富な API が用意されています。強力なことは、DataAdapter に SELECT、INSERT、UPDATE、DELETE コマンドを提供し、単一のテーブルまたは複数のテーブルからデータを添付し、1 行のコード Adapter.Fill(DataTable) または Adapter.Fill(DataSet) を提供することです。データの更新と同じ方法 Adapter.Update(DataTable)
*切断モードでの階層データの更新は、追加のコードと追加のロジックを使用して維持する必要がある接続モードでの作業よりもはるかに優れています。切断モードでは、更新操作以外に、挿入された行または更新された行または削除された行のみを更新する機能があります。 Dot Net Transaction Adapter.Update(DataTable.Select("","",DataViewRowState.Added)) 内にラップ
*切断モードでは、データ内のすべての行のバージョンを取得できます。さらに、データの変更 DataTable.GetChanges()
*非接続モードは strongTypedDataSet を提供するため、データ定義スキーマと関係を取得し、親行と子行を取得できます
*非接続モードでは、PrimaryKey によって行を取得するメソッドも提供され、特定の条件で行を取得する DataTable.Select("FilterExpression","SortOrder",DataRowViewState)
*DataTable を使用して計算を行うことができます。また、productID、ProductName、Price、Quantity、price*quantity を Total として選択するなどの計算でサーバーを乱す必要はありません。特定の基準 (price*quantity) を持つ列を簡単に追加できます。
*集計または取得した DataTable ,DataTable.Compute("Sum(price)","price>250") を作成できます
*切断モードでは、SQLコマンドを作成するCommandBuilderがありますが、単一のテーブルでのみ機能します