ADO.NET と ADO の比較
更新 : 2007 年 11 月
ActiveX データ オブジェクト (ADO: ActiveX Data Objects) の特定の機能と比較すると、ADO.NET の機能が理解できます。
データのインメモリ表現
ADO では、データのインメモリ表現はレコードセットです。ADO.NET では、これがデータセットになります。レコードセットとデータセットの間には、重要な違いがあります。
テーブルの数
レコードセットは 1 つのテーブルのように見えます。レコードセットに複数のデータベース テーブルからのデータを含める場合は、JOIN クエリを使用する必要があります。このクエリは、さまざまなデータベース テーブルからのデータを 1 つの結果テーブルにまとめます。
対照的に、データセットは 1 つ以上のテーブルの集まりです。データセット内のテーブルはデータ テーブルと呼ばれ、具体的には DataTable オブジェクトです。データセットに複数のデータベース テーブルからのデータが含まれる場合、通常は、複数の DataTable オブジェクトが含まれます。つまり、それぞれの DataTable オブジェクトが通常は 1 つのデータベース テーブルまたはビューに対応します。このようにして、データセットは元のデータベースの構造を反映できます。
通常、データセットにはリレーションシップも含まれています。データセット内のリレーションシップは、データベース内の外部キー リレーションシップに相当します。つまり、テーブルの行を互いに関連付けるものです。たとえば、データセットに投資家に関するテーブルと各投資家の株式購入に関するテーブルが含まれている場合、このデータセットには、投資家テーブルの各行と購入テーブルの対応する行とを結び付けるリレーションシップも含むことができます。
データセットには複数の異なるテーブルを含むことができ、テーブル間のリレーションシップに関する情報も保持できるため、レコードセットより豊富なデータ構造を保持できます。これには、自己関係テーブルや多対多リレーションシップを持つテーブルなども含まれます。
データの移動とカーソル
ADO では、ADO MoveNext メソッドを使用して、レコードセットの各行をシーケンシャルにスキャンできます。ADO.NET では、行がコレクションとして表されるため、すべてのコレクションと同じようにテーブル内をループすることができ、序数インデックスまたは主キー インデックスを通して特定の行にアクセスできます。DataRelation オブジェクトは、マスター レコードおよび詳細レコードに関する情報を保持し、作業中のレコードに関連するレコードを取得するためのメソッドを提供します。たとえば、Investor テーブル内の "Nate Sun" という名前の投資家の行から、この投資家の購入記録である、Purchase テーブル内の行のセットに移動できます。
メモ : |
---|
Windows フォーム アプリケーションには、データ ソースのレコード間を移動するための BindingNavigator が用意されています。詳細については、「BindingNavigator コントロール (Windows フォーム)」を参照してください。 |
"カーソル" とは、レコード間の移動を制御するデータベース要素です。データを更新したり、ほかのユーザーによってデータベースに加えられた変更を表示したりする場合に使用します。ADO.NET には、固有のカーソル オブジェクトはありませんが、従来のカーソルの役割を果たすデータ クラスが備わっています。たとえば、ADO.NET の DataReader オブジェクトでは、前方参照のみの読み取り専用のカーソルの機能が利用できます。
必要最小限の接続
ADO.NET では、Select または Update などのデータベース操作を実行するのに必要な間だけ接続を確立します。行をデータセットに読み込み、その行を使って作業するため、データ ソースとの接続を維持する必要はありません。ADO のレコードセットも非接続アクセスを提供できますが、主に接続アクセスを使用するようにデザインされています。
ADO と ADO.NET における非接続処理には、1 つの大きな違いがあります。ADO では、OLE DB プロバイダを呼び出すことでデータベースとやりとりします。ADO.NET では、TableAdapter またはデータ アダプタ (たとえば、SqlDataAdapter) を使ってデータベースと通信します。データ アダプタは、OLE DB プロバイダを呼び出すか、基になるデータ ソースから提供された API を呼び出します。重要な違いは、ADO.NET ではアダプタによって、パフォーマンスを最適化したり、データの妥当性を検査したり、他の処理を追加したりすることで、データセットへの変更をデータベースに転送する方法を制御できることです。
アプリケーションでのデータの共有
アプリケーション間で ADO.NET データセットを転送することは、接続していない ADO レコードセットを転送するよりもずっと簡単です。接続していない ADO レコードセットをコンポーネント間で転送する場合は、COM マーシャリングを使用します。ADO.NET でデータを転送するには、XML ストリームを転送できるデータセットを使用します。
XML ファイルの転送には、COM マーシャリングに比べて次のような利点があります。
豊富なデータ型
COM マーシャリングで使用できるデータ型は、COM 標準で定義されているデータ型に限られています。ADO.NET でのデータセットの転送は XML 形式に基づいているため、データ型に関する制限はありません。したがって、データセットを共有するコンポーネントは、それらのコンポーネントで通常使用されるのと同じ豊富なデータ型を使用できます。
パフォーマンス
大きな ADO レコードセットや大きな ADO.NET データセットを転送すると、ネットワーク リソースが使用されます。データのサイズが大きくなると、ネットワークにかかる負荷も増大します。ADO と ADO.NET のどちらの場合も、転送するデータを最小限に抑えることが可能です。しかし、ADO.NET には、データ型変換が必要ないという、もう 1 つのパフォーマンス上の利点があります。ADO では、コンポーネント間でレコードセットを転送するときに COM マーシャリングを必要とするため、ADO データ型を COM データ型に変換する必要があります。
ファイアウォールの通過
接続していない ADO レコードセットを 2 つのコンポーネント間で転送する場合は、ファイアウォールに阻まれる場合があります。ファイアウォールは、通常、HTML テキストは通過でき、COM マーシャリングのようなシステム レベルの要求は通過できないように設定されています。
ADO.NET データセットはコンポーネント間で XML を使用して交換されるため、ファイアウォールはデータセットの通過を許可します。