次の方法で共有


データアダプタの概要

更新 : 2007 年 11 月

データ アダプタは、ADO.NET マネージ プロバイダの重要な部分であり、データ ソースとデータセットの間の通信に使用されるオブジェクトのセットです。マネージ プロバイダには、アダプタのほかに接続オブジェクト、データ リーダー オブジェクト、およびコマンド オブジェクトが含まれます。アダプタは、データ ソースとデータセットの間でデータを交換するために使用されます。多くのアプリケーションでは、これはデータベースからデータセットにデータを読み取って、変更されたデータをデータセットからデータベースに書き込むことを意味します。しかし、データアダプタは任意のソースとデータセットの間でデータを移動できます。たとえば、Microsoft Exchange サーバーとデータセットの間でデータを移動するアダプタも考えられます。

acb32th4.alert_note(ja-jp,VS.90).gifメモ :

以前のバージョンの Visual Studio では、アプリケーションとデータベースの通信にデータ アダプタが使用されていました。データ アダプタは現在も .NET Framework データ プロバイダ (ADO.NET) の主要なコンポーネントですが、TableAdapter はデザイナで生成されるコンポーネントで、アプリケーションとデータベースの間でデータを移動する処理を簡略化します。TableAdapter の操作方法の詳細については、「TableAdapter の概要」を参照してください。

一般に、アダプタはデータセットとの間でどのようなデータを交換するかを指定できるように構成できます。これは多くの場合、データベースの読み取りまたは書き込みするときに呼び出される SQL ステートメントまたはストアド プロシージャへの参照という形を取ります。

Visual Studio によって、これらのデータ アダプタがデータベースで使用できるようになります。

  • OleDbDataAdapter オブジェクトは、OLE DB プロバイダによって公開される任意のデータ ソースと共に使用するのに適しています。

  • SqlDataAdapter オブジェクトは、SQL Server に固有のオブジェクトです。このオブジェクトは OLE DB 層を経由する必要がないため、OleDbDataAdapter クラスよりも高速です。ただし、SQL Server 7.0 以降だけで使用できます。

  • OdbcDataAdapter オブジェクトは、ODBC データ ソースへのアクセス向けに最適化されています。

  • OracleDataAdapter オブジェクトは、Oracle データベースへのアクセス向けに最適化されています。

    acb32th4.alert_note(ja-jp,VS.90).gifメモ :

    データ アダプタ、データ接続、データ コマンド、データ リーダーは、.NET Framework データ プロバイダを構成するコンポーネントです。Microsoft およびサードパーティ プロバイダには、Visual Studio に統合できるその他の .NET Framework データ プロバイダが用意されています。他の .NET Framework データ プロバイダの詳細については、「.NET Framework データ プロバイダ (ADO.NET)」を参照してください。

アダプタの作成および操作には、.NET Framework マネージ プロバイダの名前空間の一部である以下の名前空間を使用できます。

SqlClient マネージ プロバイダ名前空間
システム データ SQL 名前空間OleDb マネージ プロバイダ名前空間
SystemDataADOnamespace グラフィック

一般に、各データ アダプタは、1 つのデータ ソース テーブルとデータセット内の 1 つの DataTable オブジェクトとの間でデータを交換します。データセットに複数のデータ テーブルが含まれる場合、通常の方法としては、複数のデータアダプタからデータセットにデータを供給し、そのデータをそれぞれのデータ ソース テーブルに書き戻します。

データセットにテーブルを作成する場合は、アダプタのメソッドを呼び出して SQL ステートメントまたはストアド プロシージャを実行します。アダプタによってデータ リーダー オブジェクト (SqlDataReaderOleDbDataReaderOdbcDataReader、または OracleDataReader) が作成され、データがデータセットに読み取られます。

acb32th4.alert_note(ja-jp,VS.90).gifメモ :

データベースからデータを読み取るときにデータをデータセットに格納する必要がないため、読み取り専用データを扱うときに使用すると効率的です。詳細については、後の「読み取り専用データ」を参照してください。また、SQL ステートメントを使用してデータセットを作成しなくても、直接 SQL ステートメントを実行できます。詳細については、「コマンドとパラメータ (ADO.NET)」を参照してください。

同様に、データベースを更新する場合は、適切な SQL ステートメントまたはストアド プロシージャを呼び出すアダプタのメソッドを呼び出して、データベースに実際の更新を行います。

データアダプタおよび関連するテーブル

データセット内に個別のテーブルを持つとは、データアダプタが一般に、テーブルを結合する SQL コマンドやストアド プロシージャを参照しないことを意味します。その代わりに、関連する各テーブルからの情報は異なるアダプタによって個別にデータセットに読み込まれます。このとき、DataRelation オブジェクトは、データセット テーブル間の制約 (たとえば、連鎖更新など) を管理し、関連するマスター レコードと子レコードの間で移動できるようにするために使用されます。

たとえば、Northwind というデータベース内で 2 つの関連するテーブル Customers と Orders を使用するとします。結合を指定して 2 つのテーブルを 1 つの結果セットにまとめる代わりに、通常は 2 つのアダプタを定義します。1 つはデータセット内に Customers テーブルを作成し、もう 1 つは Order レコードを別のデータセット テーブルに読み込みます。多くの場合、これらの各アダプタには、データ テーブル内のレコード数を制限するための選択基準が含まれます。

また、Order レコードが CustomerID フィールドに基づいて Customer レコードに関連付けられることを指定するように、データセット内で DataRelation オブジェクトを定義します。テーブルを引き続き個別に管理できますが、データ ソースからレコードをフェッチする前にテーブルを結合した場合は、テーブルを個別に管理できません。関連するレコードを使用する場合は、DataRelation オブジェクトのプロパティおよびメソッドを呼び出すことができます。

データ リレーションシップの詳細については、「データセットのリレーションシップ」を参照してください。

接続オブジェクト

データアダプタでデータを読み書きするには、データ ソースへの接続が確立されている必要があります。そのため、アダプタは、接続オブジェクト (SqlConnectionOleDbConnectionOdbcConnection、または OracleConnection) を使用してデータ ソースに接続します。アダプタには、最大 4 つまでの接続参照を含めることができます。これは、アダプタが実行する 4 種類のアクション (選択、更新、挿入、および削除) に対応します。

ツールボックスの [データ] タブにある接続オブジェクトの一覧を次の表に示します。

接続オブジェクト

説明

SqlConnection

SQL Server 7.0 以降のデータベースへの接続

OleDbConnection

OLE DB データ ソースへの接続

OdbcConnection

ODBC データ ソースへの接続

OracleConnection

Oracle データベースへの接続

いずれの場合も、接続オブジェクトはデータ ソース内の固有のセッションを表します。すべての接続オブジェクトには、接続の詳細 (ユーザー ID、パスワード、接続タイムアウト設定など) を設定、変更するためのプロパティが用意されています。また、データベース トランザクションを開始、コミット、ロールバックするためのメソッドもあります。接続オブジェクトの詳細については、「データ ソースへの接続 (ADO.NET)」を参照してください。

acb32th4.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

機密情報 (サーバー名、ユーザー名、パスワードなど) を格納すると、アプリケーションのセキュリティに影響を及ぼすことがあります。データベースへのアクセスを制御する方法としては、Windows オートメーション (統合セキュリティとも呼ばれます) を使用する方が安全です。

ADO.NET コマンド オブジェクト

アダプタを使用して、データ ソース内のレコードの読み取り、追加、更新、削除が可能です。各操作をどのように行うかを指定するために、アダプタは次の 4 つのプロパティをサポートしています。

  • SelectCommand : データ ストアから行を取得するコマンド (SQL ステートメントまたはストアド プロシージャ名) の参照。

  • InsertCommand : データ ストアに行を挿入するコマンドの参照。

  • UpdateCommand : データ ストアの行を変更するコマンドの参照。

  • DeleteCommand : データ ストアから行を削除するコマンドの参照。

プロパティ自体は、オブジェクトです。プロパティは、SqlCommandOleDbCommandOdbcCommand、または OracleCommand のいずれかのクラスのインスタンスです。これらのオブジェクトは、SQL ステートメントまたはストアド プロシージャへの参照を含む CommandText プロパティをサポートしています。

acb32th4.alert_note(ja-jp,VS.90).gifメモ :

コマンド クラスは接続クラスと一致する必要があります。たとえば、SqlConnection オブジェクトを使用して SQL Server と通信している場合は、SqlCommand クラスから派生したコマンドを使用する必要があります。

コマンド オブジェクトのテキストは明示的に設定できますが、必ずしも設定する必要はありません。多くの場合は、Visual Studio によって必要な SQL ステートメントが生成されます。また、UpdateCommand、InsertCommand、または DeleteCommand オブジェクトが指定されていない場合は、実行時にアダプタが適切な SQL ステートメントを自動的に生成します。詳細については、「CommandBuilder でのコマンドの生成 (ADO.NET)」を参照してください。

ただし、デザイン時および実行時にコマンド オブジェクトを操作することで、コマンドの実行をより直接的に制御できます。たとえば、SelectCommand オブジェクトに関連付けられたコマンドを実行の直前に作成したり変更したりできます。

データアダプタに依存せずに、コマンドを自分で実行することもできます。これにより、データベース定義の設定や変更に使用するコマンドなど、任意の SQL コマンドをデータアダプタを通して渡すことができます。また、レコードセットを返さないストアド プロシージャを直接呼び出すこともできます。たとえば、データベースに対してユーザーの入力が適切かどうかを確認するストアド プロシージャなどです。詳細については、「コマンドの実行 (ADO.NET)」を参照してください。

acb32th4.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

CommandType プロパティを Text に設定したデータ コマンドを使用するときは、クライアントから送信された情報をデータベースに渡す前に、その情報を十分にチェックしてください。悪意のあるユーザーが、承認なしでデータベースにアクセスしたり、データベースを破壊したりする目的で、変更した SQL ステートメントや追加の SQL ステートメントの送信 (埋め込み) を試みる場合があります。ユーザーの入力をデータベースに転送する前に、その情報が有効であることを常に検証する必要があります。できる限り、常にパラメータ化されたクエリまたはストアド プロシージャを使用することをお勧めします。詳細については、「スクリプトによる攻略の概要」を参照してください。

コマンド パラメータ

通常、データアダプタ内のコマンドは、パラメータ ドリブンです。たとえば、SelectCommand プロパティに対するコマンドは、多くの場合、WHERE 句にパラメータを持ち、データベースからどのレコードを取得するかを実行時に指定できるようになっています。その他のコマンドでは、パラメータを使用して、レコードに書き込むデータや、データベース内のどのレコードを更新するかなどの情報を実行時に渡すことができます。データ アダプタでのパラメータの使い方の詳細については、「データ アダプタ コマンドのパラメータ」を参照してください。

データアダプタによる読み取りと更新

データアダプタの主要な目的は、データ ストアとデータセットの間でデータを交換することです。アダプタは、この両者の間でデータを移動するために固有のメソッドをサポートしています。

acb32th4.alert_note(ja-jp,VS.90).gifメモ :

データを読み取るだけで更新しない場合には、データをデータセットに格納する必要はありません。その代わりに、データベースからアプリケーションに直接読み込むことができます。詳細については、後の「読み取り専用データ」を参照してください。

データアダプタを使用して次のことができます。

  • データ ストアの行をデータセット内の対応するデータ テーブルに取得する。

    行をデータセットに取得するには、データ アダプタ オブジェクト (SqlDataAdapterOleDbDataAdapterOdbcDataAdapter、または OracleDataAdapter) に対して Fill メソッドを使用します。Fill メソッドを呼び出すと、データ ストアに SQL SELECT ステートメントが送信されます。

  • データセット テーブルに加えられた変更を対応するデータ ストアに送信する。

    データセットのデータセット テーブルをデータ ストアに送信するには、アダプタの Update メソッドを使用します。このメソッドを呼び出すと、対象のレコードを新しく作成するか、変更するか、または削除するかに応じて、必要な SQL INSERT、UPDATE、または DELETE ステートメントが実行されます。

    データ アダプタを使用して更新を実行する方法の詳細については、「DataAdapter によるデータ ソースの更新 (ADO.NET)」を参照してください。

読み取り専用データ

クエリ結果を使用して逐次読み取り専用でデータを渡す必要がある場合は、データセットを設定する代わりにデータ リーダー オブジェクトを使用できます。データ リーダー オブジェクトは、データ ソースからデータをフェッチし、直接アプリケーションに渡します。一般に、データ リーダー オブジェクトは、データをデータセットにキャッシュする必要がないときに、データに対して読み取り専用で前方のみのアクセスを行うために使用されます。ただし、データアダプタ自体は、データセットにデータを格納するときにデータ リーダー オブジェクトを使用します。読み取り専用アクセスの例としては、データベース情報を表示する Web フォーム ページがあります。Web フォーム ページはラウンドトリップごとに再作成されるため、多くの場合、データをデータセットに格納しても意味がありません。

Visual Studio には、4 つのデータ リーダー オブジェクト (SqlDataReaderOleDbDataReaderOdbcDataReader、および OracleDataReader) が用意されています。読み取り専用アクセスを効率良く実行するためのデータ リーダー オブジェクトの使い方の詳細については、「DataAdapter と DataReader (ADO.NET)」を参照してください。

テーブル割り当て

Visual Studio ツールを使用してデータベース テーブルからデータセットを生成した場合、既定では、データセット内のテーブル名と列名がデータベース内の名前と同じになります。しかし、これでは都合が悪い場合もあります。たとえば、データベースで使用されている名前が簡潔または冗長すぎる場合や、名前が外国語で表記されている場合などです。また、既存のスキーマで作業している場合は、スキーマで定義された名前がデータベースで使用されている名前と一致しないこともあります。

したがって、データベース内の名前とデータセット内の名前が一致している必要はありません。その代わりに、データセット コマンドで新しいテーブル名および列名を作成して、データベースで使用されている名前に関連付けることができます。アダプタは、TableMappings コレクションを使用して、データセットの構造 (データ テーブルおよびデータ列) とデータ ストアの構造 (テーブルおよび列) との間の対応を維持します。テーブル割り当ての詳細については、「データアダプタでのテーブル割り当て」を参照してください。

参照

処理手順

方法 : データ アダプタのパラメータを設定する

方法 : データ ソース列をデータセットのデータ テーブル列に割り当てる

概念

DataAdapter からの DataSet の読み込み (ADO.NET)

データの新機能

Visual Studio を使用したデータ アプリケーションの作成

その他の技術情報

DataAdapter と DataReader (ADO.NET)

データアダプタの作成

データに関するチュートリアル

ADO.NET