次の方法で共有


ADO プログラマ向けの ADO.NET

 

ダグ ロットハウス
Mike Pizzo

Microsoft Corporation

2001 年 12 月

概要: この記事では、ADO.NET を通じて利用できるデータ アクセス アーキテクチャの概要について説明し、ADO に精通している開発者からよく寄せられる質問に回答します。 (11ページ印刷)

内容

はじめに
概要
ADO の設計
ADO.NET: 明示的および要素化
データ型
まとめ
よく寄せられる質問
   Recordset はどうなっていますか?
   カーソルはどうなっていますか?
   データ ソースから切断されている場合は、データベースのデータを DataSet に設定操作方法。
   DataSet の変更をデータベースに戻操作方法解決しますか?
   adPersistXml と同様に、XML で ADO.NET を使用操作方法。
   .NET Frameworkで、データの取得と更新に ADO を使用する既存の COM コンポーネントを使用操作方法。

はじめに

.NET Frameworkでは、Microsoft ActiveX® Data Objects (ADO) プログラミング モデルによって®提供されるデータ アクセス アーキテクチャの進化である ADO.NET が導入されています。 ADO.NET は、COM プログラマの ADO を置き換えるものではありません。むしろ、.NET プログラマはリレーショナル データ ソース、XML、アプリケーション データにアクセスできます。 ADO.NET では、アプリケーション、ツール、言語、インターネット ブラウザーで使用されるデータベース クライアントや中間層ビジネス オブジェクトの作成など、さまざまな開発ニーズがサポートされています。

ADO プログラマを念頭に置いて構築された ADO.NET には、ADO と多くの類似点が含まれており、その設計にはいくつかの新しい概念も導入されています。 この記事では、最初に ADO.NET を調べるときに ADO プログラマが遭遇する最も一般的な質問について説明します。

概要

ADO は、当初から、COM プログラマがデータを操作するための効率的で堅牢なインターフェイスを提供してきました。 ADO は、Microsoft Visual Basic® 6.0、Microsoft Visual C++ ®、さまざまなスクリプト インターフェイスを含む任意の自動化言語から呼び出すことができるため、さまざまなストアへのインターフェイスとして広く使用されています。

ADO.NET は、プラットフォームの相互運用性とスケーラブルなデータ アクセスを向上する ADO の進化です。 ADO.NET で新しいデータ アクセス API のセットを作成すると、ADO を.NET Frameworkに直接移植するよりも次の利点が得られます。

XML との統合が改善されました。 ADO の設計に続いて、XML はアプリケーションの設計においてますます重要な役割を果たすようになりました。 ADO.NET は、XML と統合するように一から設計され、基本的な方法で XML を活用します。 データとそのリレーショナル構造の両方を XML として保持および読み込むだけでなく、ADO.NET は層またはクライアント間のデータのリモート処理に XML に依存します。 ADO.NET 使用する汎用 XML 表現は、制限の厳しいセキュリティ境界を持つものも含め、任意のネットワーク経由でデータを送信するための便利な方法を提供します。 ADO.NET では、XML ツールを使用して、リレーショナル データに対して検証、階層クエリ、およびデータ変換を実行します。

.NET Framework: Recordset などの ADO コンストラクトとの統合では、使い慣れたプログラミング コンストラクトは使用されませんが、代わりにデータベース指向としてモデル化されます。 たとえば、データの移動と取得に使用されるカーソルは、配列やコレクションなどの他のデータコンストラクトとは異なる方法で機能します。 ただし、ADO.NET では、配列やコレクションを含む共通の.NET Framework構造を介してメモリ内データを公開できるため、リレーショナル データを操作する際の一般的なアクセス方法を提供できます。

切断されたビジネス モデルのサポートが改善されました。 ADO では、Recordset を使用した切断されたアクセスの制限付きサポートが提供されます。 ADO.NET では、リレーショナル データの一般的なメモリ内表現として機能する DataSet という新しいオブジェクトが導入されています。 DataSet は設計上、常に切断されます。 外部リソースへの永続的な接続は保持されないため、データのパッケージ化、交換、キャッシュ、永続化、読み込みに最適です。

データ アクセス動作の明示的な制御: ADO の設計には、アプリケーションで常に必要であるとは限らないため、パフォーマンスが制限される可能性がある暗黙的な動作が含まれています。 ADO.NET は、予測可能な動作、パフォーマンス、セマンティクスを備えた明確に定義された要素を提供し、高度に最適化された方法で一般的なシナリオに対処できます。

設計時のサポートが改善されました。 ADO は、多くの場合、取得コストの高いメタデータに基づいて、実行時に暗黙的にデータに関する情報を派生させます。 一方、ADO.NET、設計時に既知のメタデータを活用して、実行時のパフォーマンスを向上させ、実行時の動作の一貫性を高めます。

ADO の設計

ADO.NET のモデルと設計について理解を深めるために、ADO の主要な側面をいくつか確認すると役立ちます。

ADO では、すべての種類のデータを操作するための一般的な表現として、単一のオブジェクト Recordset を使用します。 Recordset は、データベースからの結果の順方向専用ストリームの操作、サーバーに保持されているデータのスクロール、またはキャッシュされた結果のセットのスクロールに使用されます。 データに加えられた変更は、データベースに直ちに適用することも、オプティミスティック検索および更新操作を使用してバッチとして適用することもできます。 Recordset を作成するときに目的の機能を指定します。結果の Recordset の動作は、要求するプロパティによって大きく異なる場合があります。

ADO では、さまざまな方法で動作できる単一のオブジェクトを使用するため、アプリケーションのオブジェクト モデルを非常に単純に保つことができます。 ただし、その 1 つのオブジェクトによって示される動作、パフォーマンス、セマンティクスは、オブジェクトの生成方法とアクセスするデータによって大きく異なる可能性があるため、一般的で予測可能で最適化されたコードを記述することは困難です。 これは、コンポーネントによって生成されないデータを使用しようとし、コンポーネントが必要な動作や機能を指定できない汎用コンポーネント (グリッド コントロールなど) に特に当てはまります。

ADO.NET: 明示的および要素化

ADO.NET の設計では、開発者がデータにアクセスして操作するときによく直面するタスクを考慮しました。 1 つのオブジェクトを使用して多数のタスクを実行するのではなく、開発者が各タスクを実行できるように最適化された明示的なオブジェクトに特定の機能を ADO.NET します。

ADO Recordset が提供する機能は、ADO.NET の明示的なオブジェクトに組み込まれています。DataReader は、クエリ結果への高速で前方専用の読み取り専用アクセスを提供します。DataSet。データのメモリ内リレーショナル表現を提供します。DataSet とデータ ソース間のブリッジを提供する DataAdapter ADO.NET Command オブジェクトには、行を返さないコマンドの ExecuteNonQuery メソッドや、行セットではなく単一の値を返すクエリの ExecuteScalar メソッドなどの明示的な機能も含まれています。

ADO.NET の設計が、明示的な動作を実行するように最適化されたオブジェクトで構成されるしくみをより深く理解するには、データを操作するときに一般的な次のタスクを検討してください。

Forward-Only Read-Only データ ストリーム

アプリケーション(特に中間層アプリケーション)は、一連の結果をプログラムで処理することが多く、ユーザーの操作や、読み取り時に結果を更新したりスクロールしたりする必要はありません。 ADO では、この種類のデータ取得は、前方スクロール カーソルと読み取り専用ロックを持つ Recordset を使用して実行されます。 ただし、ADO.NET では、 DataReader オブジェクトは、データベースから結果を取得するための最も効率的なメカニズムを提供する、バッファーなしの順方向専用の読み取り専用ストリームを提供することで、この種類のデータ取得を最適化します。 この効率の多くは、 DataReader がこの目的のためにのみ設計された結果として得られます。データがデータ ソースで更新されたり、ADO Recordset と同様にローカルにキャッシュされたりするシナリオをサポートする必要はありません。

単一の値を返す

多くの場合、データベースから取得する唯一のデータは 1 つの値 (アカウント残高など) です。 ADO では、この種類のデータ取得を実行するには、Recordset オブジェクトを作成し、結果を読み取り、単一の値を取得してから Recordset を閉じます。 ただし、ADO.NET では、 Command オブジェクトは ExecuteScalar メソッドを使用してこの関数をサポートします。このメソッドは、結果を保持する追加のオブジェクトを導入しなくても、データベースから単一の値を返します。

データへの切断されたアクセス

データを公開するための頻繁なケースは、ユーザーがロックを保持したり、サーバー上のリソースを同じにしたりすることなく、アドホックな方法でデータを移動できる表現です。 このシナリオの例としては、データをコントロールにバインドしたり、複数のデータ ソースや XML からのデータを組み合わせたりします。 ADO Recordset では、クライアント側のカーソル位置を使用して、これらのシナリオをサポートしています。 ただし、ADO.NET では、 DataSet はそのようなタスク用に明示的に設計されています。

DataSet には、さまざまなソースからの結果を保持できる、完全に切断された一般的なデータ表現が用意されています。 DataSet はデータ ソースから完全に独立しているため、データがデータベースから読み込まれるか、XML から読み込まれるか、アプリケーションによって生成されるかに関係なく、同じパフォーマンスとセマンティクスが提供されます。 1 つの DataSet には、複数の異なるデータベースとその他のデータベース以外のソースから設定されたテーブルが含まれる場合があります。 DataSet のコンシューマーに対して、すべてがまったく同じように見え、動作します。 DataSet 内では、あるデータベース ("Customers" など) から設定されたテーブルから、まったく異なるデータベース ("Orders" など) から入力された関連テーブルに移動し、そこから XML から読み込まれた値を含む 3 番目のテーブル ("OrderDetails" など) に移動するリレーションシップを定義できます。 DataSet のリレーショナル機能は Recordset よりも優れているため、複数のテーブルからの結果を 1 つの結合結果として公開するか、複数の個別の結果セットを返すことで結果を手動で処理および関連付ける必要があります。 Recordset には (MSDataShape プロバイダーを使用して) 階層的な結果を返して移動する機能がありますが、 DataSet は、関連する結果セットを処理する際の柔軟性が大幅に向上します。 DataSet は、XML スキーマ定義言語 (XSD) を使用して定義されたスキーマを使用して、リモート クライアントまたはサーバーとの間で開いている XML 形式で結果を送受信する機能も提供します。

データ ソースからのデータの取得と更新

お客様からのフィードバックと一般的なユース ケースに基づいて、ほとんどのアプリケーション開発シナリオ (アドホック ツールと汎用データ コンポーネントを除く) では、開発者は、デザイン時にデータに関する特定の事柄を理解していることは明らかです。ADO のようなテクノロジは実行時に派生しようとします。 たとえば、ほとんどの中間層アプリケーションでは、アプリケーション開発時、アクセスするデータベースの種類、実行されるクエリ、結果の返し方を開発者が認識しています。 ADO.NET は、実行時のパフォーマンスと予測可能性を向上させるために、設計時にこの知識を適用する機能を提供します。

たとえば、ADO Recordset オブジェクトでバッチ更新を使用する場合は、変更された行ごとに適切な INSERT、UPDATE、DELETE ステートメントを実行して、データベースに変更を送信する必要があります。 ADO は、多くの場合、取得コストの高いメタデータに基づいて、実行時にこれらのステートメントを暗黙的に生成します。 ただし、ADO.NET、INSERT、UPDATE、DELETE コマンド、および DataAdapter を使用して DataSet の変更をデータ ソースに解決するために使用されるストアド プロシージャなどのカスタム ビジネス ロジックを明示的に指定できます。 このモデルでは、アプリケーション データの返し方と更新方法をより詳細に制御でき、実行時にメタデータを収集する費用が不要になります。

DataAdapter は、DataSet とデータ ソースの間のブリッジを提供します。 DataAdapter は、DataSet にデータベースからの結果を設定し、DataSet から変更を読み取り、それらの変更をデータベースに解決するために使用されます。 DataAdapter という別のオブジェクトを使用してデータベースと通信すると、DataSet は含まれるデータに対して完全に汎用的であり続け、コマンドを実行するタイミングと方法、および変更をデータベースに送信するタイミングと方法をより詳細に制御できます。 ADO は、この動作の多くを暗黙的に実行しますが、ADO.NET の明示的な設計を使用すると、最適なパフォーマンスとスケーラビリティのためにデータ ソースとの対話を微調整できます。

ADO の暗黙的な更新動作は、1 つのテーブル SELECT に基づいて DataAdapter によるクエリに使用される INSERT、UPDATE、DELETE コマンドを自動的に生成する CommandBuilder オブジェクトを使用する ADO.NET でも使用できます。 ただし、ADO と同様に、実行時に収集されたメタデータからコマンドが生成されるため、この利便性の侵害により、パフォーマンスが低下し、データ ソースへの変更の伝達方法の制御が低下します。

データ型

ADO では、すべての結果が標準の OLE オートメーション バリアント 型で返されます。 これは、変換オーバーヘッドに加えて、タスクによって割り当てられたシステム メモリを使用してバリアントが割り当てられ、システム全体で競合が発生するため、パフォーマンスを妨げる可能性があります。 ただし、ADO.NET の DataReader から結果を取得する場合は、コストのかかる変換を行わずに、ネイティブ データ型の列を共通 の Object クラスとして取得できます。 データ値は、.NET Framework型として公開することも、ネイティブ型の忠実性を維持するために.NET Framework内の独自の構造に配置することもできます。 その例として、Microsoft SQL Server データを.NET Framework型として公開したり、System.Data.SqlTypes 名前空間のクラスによって定義された独自の型として公開® ™したりするために使用できる、SQL Server .NET データ プロバイダーがあります。

まとめ

ADO.NET は、ADO プログラミング モデルの強度に基づいて構築し、開発者の変化するニーズを満たすためにデータ アクセス テクノロジの進化を提供するように設計されています。 ADO に関する既存の知識を活用しながら、データにアクセスして操作する際のアプリケーションのコンポーネント、リソース、動作を細かく制御できるように設計されています。

  • ADO.NET を使用したデータへのアクセス

    ADO.NET アーキテクチャと、ADO.NET クラスを使用してアプリケーション データを管理し、Microsoft SQL Server、OLE DB、XML などのデータ ソースと対話する方法について説明します。

  • ADO.NET の概要

    ADO.NET のデザインとコンポーネントを紹介します。

  • .NET データ プロバイダーを使用したデータへのアクセス

    .NET データ プロバイダーのコンポーネントと、それらを使用してリレーショナル データ ソースにアクセスする方法について説明します。

  • データセットの作成と使用

    DataSet と、それを使用してアプリケーション内のリレーショナル データを管理する方法について説明します。

  • XML と DataSet

    DataSet がデータ ソースとして XML と対話する方法について説明します。これには、DataSet の内容を XML として読み込んで保持したり、DataSetXmlDataDocument を同期したりする方法が含まれます。

よく寄せられる質問

このセクションでは、ADO に慣れている開発者が、ADO.NET に慣れ始める中で最もよく寄せられる質問に回答します。

Recordset はどうなっていますか?

ADO Recordset は、機能を 1 つのオブジェクトにバンドルし、多くの動作を暗黙的に処理します。 一方、ADO.NET は、動作を個別のコンポーネントに組み込み、動作を明示的に制御できるように設計されています。 次の表では、ADO Recordset の機能を提供する個々の ADO.NET オブジェクトについて説明します。

ADO.NET オブジェクト 説明
DataReader データ ソースからのデータの転送専用の読み取り専用ストリームを提供します。

DataReader は、 と LockType = adLockReadOnlyの Recordset にCursorType = adOpenForwardOnly似ています。

データセット リレーショナル データへのメモリ内アクセスを提供します。

DataSet は特定のデータ ソースに依存しないため、リレーショナル データベースや XML を含む複数の異なるデータ ソースからデータを設定したり、アプリケーションにローカルのデータを設定したりできます。 データは 1 つ以上のテーブルのコレクションに格納され、一度に 1 つの行にアクセスする必要がある ADO とは異なり、可用性に制限なく、連続せずにアクセスできます。 DataSet には、JOIN から 1 つの結果セットが作成される ADO Recordset と同様に、テーブル間のリレーションシップを含めることができます。 DataSet には、テーブルに対する一意、主キー、および外部キーの制約を含めることもできます。

DataSet は、、CursorType = adOpenStatic、および を含む Recordset にLockType = adLockOptimisticCursorLocation = adUseClient似ています。 ただし、 DataSet には、アプリケーション データを管理するための Recordset に対する拡張機能があります。

DataAdapter リレーショナル データベースのデータを DataSet に設定し、 DataSet の変更をデータ ソースに解決します。

DataAdapter を使用すると、Recordset が暗黙的に実行する動作を明示的に指定できます。

カーソルはどうなっていますか?

ADO では、共通の Recordset オブジェクト内で、カーソルが更新可能であるか読み取り専用であるか、クライアントまたはサーバーに実装されているかなど、カーソルの動作を定義する異なるプロパティを持つ複数の異なるカーソルの種類 (動的、キーセット、静的、順方向のみ) を要求できます。 ただし、ADO.NET では、さまざまなクラスが公開され、各種類の相互作用をより詳細に制御できます。 DataReader は、データベースから結果のストリームを取得できる、非常に高速で順方向専用の読み取り専用カーソルをサーバー側に提供します。 DataSet には、完全に切断された "クライアント" カーソルが用意されています。このカーソルを使用すると、ADO の静的カーソルと同等のスクロールと更新を行うことができます。 これらのオブジェクトは、DataSet とデータベースの間でデータを移動できる DataAdapter と共に、最も一般的な種類のデータ操作に最適なアクセス方法を提供します。

バージョン 1.0 ADO.NET は、スクロール可能で更新可能なサーバー側カーソルを公開しないことに注意してください。 クライアント側でスクロールと配置された更新を必要とするアプリケーションには、通常、ユーザー操作が含まれます。 サーバー側カーソルはサーバー上に状態を保持する必要があるため、ユーザーがクライアント側のデータを操作する際に重要なリソースを保持する必要がある場合、アプリケーションは堅牢またはスケーラブルになりません。 クライアントで現在スクロール可能なサーバー側カーソルを使用しているほとんどのアプリケーションは、次のいずれかの設計に従って、はるかに効率的に記述できます。

  • ストアド プロシージャを使用してカスタム ロジックを処理し、クライアントではなくサーバーで実行します。
  • 転送専用の読み取り専用カーソルを使用してサーバーからデータを返し、コマンドを実行して更新を処理します。
  • DataSet に結果を設定し、ローカルでデータを変更してから、それらの変更をサーバーに反映します。

データ ソースから切断されている場合は、データベースのデータを DataSet に設定操作方法。

DataSet の変更をデータベースに戻操作方法解決しますか?

DataAdapter は、DataSet とデータ ソースの間のブリッジを提供します。 DataAdapter で使用する明示的なコマンドを定義することで、DataSet にデータ セットを設定し、DataSet 内の挿入、更新、削除をデータ ソースに戻して解決するための動作を制御します。

DataAdapter コマンドのプロパティは、SelectCommandInsertCommandUpdateCommandDeleteCommand です。 各コマンドは、データ ソースの SELECT、INSERT、UPDATE、DELETE アクションに直接対応します。 さらに、これらのアクションはストアド プロシージャ呼び出しとして最適化できます。 DataAdapter コマンドが定義されたら、DataSetDataAdapterFill メソッドに渡して、SelectCommand によって返された結果を DataSet に入力するか、DataSetDataAdapterUpdate メソッドに渡して DataSet の変更をデータ ソースに反映できます。 InsertCommand は、DataSet に追加された行を処理します。 UpdateCommand は、DataSet で変更された既存の行を処理します。 DeleteCommand は、DataSet から削除された既存の行を処理します。

adPersistXml と同様に、XML で ADO.NET を使用操作方法。

DataSet は、XML を使用して DataSet 内のスキーマとデータを読み込んで保持するための広範なサポートを提供します。 任意の XML 形式から DataSet の内容を読み込み、 DataSet の内容を XML 形式に書き込むことができます。この形式は、XML として保存された ADO Recordset よりもはるかに単純で汎用的です。 DataSet のスキーマ (リレーショナル構造) は、単純な XML スキーマ定義言語 (XSD) スキーマとして簡単に永続化または作成できます。 XML ドキュメントに XML スキーマが指定されておらず、 DataSet 内にスキーマが定義されていない場合、 DataSet は XML ドキュメント内の XML 要素からスキーマを推論できます。 さらに、 DataSet を使用すると、行と列の XML ドキュメントへの書き込みと XML ドキュメントからの読み取り方法を制御できます。 列は、属性、要素、または単純なコンテンツとしてマップすることも、非表示にすることもできます (書き出されません)。 関連する行は、親要素内で入れ子にすることも、兄弟要素として扱うことができます。

DataSetXmlDataDocument と同期して、1 つのデータ セットのリレーショナルビューと階層ビューを同時に提供することもできます。 DataSetXmlDataDocument と同期することで、データに対して XML パス言語 (XPath) クエリを実行したり、拡張スタイルシート言語変換 (XSLT 変換) をデータに適用したりする機能など、DataSet 内のデータの他の XML 機能にもアクセスできます。

SQL Server .NET データ プロバイダーには、SqlCommand を使用して、Microsoft SQL Server 2000 以降に対する FOR XML クエリの結果を XmlReader として直接返す機能も用意されています。

SQLXML 2.0 (SQL Server 2000 の XML) には、ADO.NET で提供される XML 機能に加えて、.NET Frameworkから Microsoft SQL Server 2000 以降の XML 機能にアクセスできる SQLXML マネージ クラスが含まれています。 たとえば、これらのクラスを使用すると、XML テンプレートを実行したり、サーバーのデータに対して XPath クエリを実行したり、Updategrams または Diffgrams を使用してデータの更新を実行したりできます。

  • SQL Serverから XML としてデータを取得する

    Microsoft SQL Server 2000 以降の FOR XML クエリの結果を、SQL Server .NET データ プロバイダーを使用して XmlReader として返す方法について説明します。

  • XML と DataSet

    DataSet がデータ ソースとして XML と対話する方法について説明します。これには、DataSet の内容を XML として読み込んで永続化したり、DataSetXmlDataDocument を同期したりする方法が含まれます。

  • SQLXML 2.0 (SQL Server 2000 の XML)

    microsoft SQL Server 2000 (SQLXML 2.0) 用 XML のリリースを提供します。これには、.NET Frameworkで使用する SQLXML マネージド クラスが含まれます。

操作方法、データの取得と更新に ADO を使用する既存の COM コンポーネントを.NET Frameworkで使用しますか?

ADO オブジェクトを返すか使用する COM コンポーネントは、COM 相互運用サービスを使用して.NET Frameworkで使用できます。 さらに、OLE DB .NET データ プロバイダーには、既存の COM コンポーネントによって返される ADO Recordset オブジェクトまたは Record オブジェクトを入力として受け取り、ADO オブジェクトに含まれるデータを DataSet に設定する OleDbDataAdapter.Fill メソッドへのオーバーロードが含まれています。 DataSet 内のデータへの更新は、DataAdapter を使用してデータ ソースに反映できます。 また、拡張スタイルシート言語変換 (XSLT 変換) を使用して、ADO Recordset の XML 形式と ADO.NET DataSet の XML 形式を変換することもできます。