次の方法で共有


.NET Framework アプリケーションで TableAdapters を使用してデータセットを埋める

DataSet クラスと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初頭のレガシ .NET Framework テクノロジです。 このテクノロジは、ユーザーがデータを変更し、変更をデータベースに保持できるアプリに特に役立ちます。 データセットは実証済みの成功したテクノロジですが、新しい .NET アプリケーションには Entity Framework Core を使用することをお勧めします。 Entity Framework は、オブジェクト モデルとして表形式データを操作するより自然な方法を提供し、よりシンプルなプログラミング インターフェイスを備えています。

TableAdapter コンポーネントは、指定した 1 つ以上のクエリまたはストアド プロシージャに基づいて、データベースからのデータをデータセットに格納します。 TableAdapters では、データベースに対して追加、更新、削除を実行して、データセットに加えた変更を保持することもできます。 さらに、特定のテーブルに関係のないグローバル コマンドを発行することもできます。

Visual Studio デザイナーは TableAdapters を生成します。 プログラムでデータセットを作成する場合は、 DataAdapter .NET クラスを使用します。

TableAdapter 操作の詳細については、次のいずれかの記事に直接スキップできます。

[アーティクル] 説明
TableAdapters の作成と構成 デザイナーを使用して TableAdapters を作成および構成する方法について説明します。
パラメーター化された TableAdapter クエリを作成する ユーザーが TableAdapter プロシージャまたはクエリに引数を指定できるようにする方法について説明します。
TableAdapter を使用してデータベースに直接アクセスする TableAdapters の DbDirect メソッドを使用する方法について説明します。
データセットの入力中に制約を無効にする データを更新するときに外部キー制約を操作する方法について説明します。
TableAdapter の機能を拡張する TableAdapters にカスタム コードを追加する方法について説明します。
XML データをデータセットに読み取る データセット内の XML データを操作する方法について説明します。

TableAdapter の概要

TableAdapters は、データベースに接続し、クエリまたはストアド プロシージャを実行し、返されたデータを DataTable に入力する、デザイナーによって生成されるコンポーネントです。 TableAdapters は、更新されたデータをアプリケーションからデータベースに送り返します。 TableAdapter は、関連付けられているテーブルのスキーマに準拠するデータを返す限り、必要な数のクエリを実行できます。 次の図は、TableAdapters がメモリ内のデータベースやその他のオブジェクトと対話する方法を示しています。

クライアント アプリケーションの TableAdapter データ フローを示す図。

TableAdapter はデータセット デザイナーを使用して設計されていますが、 TableAdapter クラスは DataSetの入れ子になったクラスとして生成されません。 代わりに、各データセットに固有の個別の名前空間に配置されます。 たとえば、NorthwindDataSetという名前のデータセットがある場合、NorthwindDataSet内のDataTable オブジェクトに関連付けられている TableAdapters は、NorthwindDataSetTableAdapters名前空間にあります。 プログラムで特定の TableAdapter にアクセスするには、 TableAdapter クラスの新しいインスタンスを宣言します。 例えば次が挙げられます。

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

関連付けられた DataTable スキーマ

TableAdapter を作成するときは、最初のクエリまたはストアド プロシージャを使用して、TableAdapter に関連付けられている DataTableのスキーマを定義します。 この初期クエリまたはストアド プロシージャを実行する場合は、TableAdapter の Fill メソッドを呼び出します。このメソッドは、TableAdapter に関連付けられている DataTableを満たします。 TableAdapter のメイン クエリに加えた変更は、関連付けられているデータ テーブルのスキーマに反映されます。 たとえば、メイン クエリから列を削除すると、データセット デザイナーによって、関連付けられているデータ テーブルからも列が削除されます。 TableAdapter の追加クエリで、メイン クエリにない列を返す SQL ステートメントを使用する場合、データセット デザイナーはメイン クエリと追加クエリの間で列の変更を同期しようとします。

TableAdapter 更新コマンド

TableAdapter の更新機能は、 TableAdapter ウィザードのメイン クエリで使用できる情報の量によって異なります。 たとえば、( JOINを使用して) 複数のテーブルから値をフェッチするように構成されている TableAdapter、スカラー値、ビュー、集計関数の結果は、最初は、基になるデータベースに更新プログラムを送信する機能を使用して作成されません。 ただし、[プロパティ] ウィンドウで InsertCommandUpdateCommandDeleteCommand の各プロパティを手動で構成できます。

TableAdapter クエリ

TableAdapters には、関連付けられているデータ テーブルに入力する複数のクエリを含めることができます。 各クエリが、関連付けられているデータ テーブルと同じスキーマに準拠するデータを返す限り、アプリケーションで必要な数の TableAdapter のクエリを定義できます。 この機能により、TableAdapter は異なる条件に基づいて異なる結果を読み込むことができます。

複数のクエリを含む TableAdapter を示す図。

たとえば、アプリケーションに顧客名を含むテーブルが含まれている場合は、特定の文字で始まるすべての顧客名をテーブルに入力するクエリを作成できます。 同じ状態にあるすべての顧客をテーブルに格納する別のクエリを作成できます。 特定の州内の顧客を Customers テーブルに格納するには、州の値を示すパラメーターを受け取る FillByState クエリを、SELECT * FROM Customers WHERE State = @State のように作成できます。 FillByState メソッドを呼び出し、パラメーター値を渡してクエリを実行します (例: CustomerTableAdapter.FillByState("WA"))。

TableAdapter のデータ テーブルと同じスキーマのデータを返すクエリを追加するだけでなく、スカラー (単一) 値を返すクエリを追加することもできます。 たとえば、顧客数 (SELECT Count(*) From Customers) を返すクエリは、返されたデータがテーブルのスキーマに準拠していない場合でも、 CustomersTableAdapterに対して有効です。

ClearBeforeFill プロパティ

既定では、TableAdapter のデータ テーブルに入力するクエリを実行するたびに、既存のデータがクリアされ、クエリの結果のみがテーブルに読み込まれます。 クエリが返すデータをデータ テーブル内の既存のデータに追加またはマージする場合は、TableAdapter の ClearBeforeFill プロパティを false に設定します。 データをクリアするかどうかに関係なく、更新を永続化する場合は、明示的にデータベースに送り返す必要があります。 そのため、テーブルを満たす別のクエリを実行する前に、テーブル内のデータに対する変更を必ず保存してください。 詳細については、「 TableAdapter を使用してデータを更新する」を参照してください。

TableAdapter の継承

TableAdapters は、構成された DataAdapter クラスをカプセル化することで、標準データ アダプターの機能を拡張します。 既定では、TableAdapter は Component クラスから継承し、 DataAdapter クラスにキャストすることはできません。 TableAdapter を DataAdapter クラスにキャストすると、 InvalidCastException エラーが発生します。 TableAdapter の基底クラスを変更するには、データセット デザイナーの TableAdapter の基底クラス プロパティで、Component クラスから派生するクラスを指定します。

TableAdapter のメソッドとプロパティ

TableAdapter クラスは .NET 型ではありません。つまり、オブジェクト ブラウザーまたは参照ドキュメントで参照することはできません。 前に説明したウィザードのいずれかを使用すると、Visual Studio によってデザイン時に作成されます。 Visual Studio で作成する TableAdapter に割り当てる名前は、使用しているテーブルの名前に基づいています。 たとえば、 Orders という名前のデータベース内のテーブルに基づいて TableAdapter を作成すると、TableAdapter には OrdersTableAdapter という名前が付けられます。 TableAdapter のクラス名を変更するには、データセット デザイナーの [プロパティ] ウィンドウで Name プロパティを使用します。

TableAdapter の一般的に使用されるメソッドとプロパティは次のとおりです。

メンバー 説明
TableAdapter.Fill TableAdapter の関連付けられたデータ テーブルに、TableAdapter の SELECT コマンドの結果を入力します。
TableAdapter.Update 変更をデータベースに戻し、更新の影響を受ける行数を表す整数を返します。 詳細については、「 TableAdapter を使用してデータを更新する」を参照してください。
TableAdapter.GetData データが格納された新しい DataTable を返します。
TableAdapter.Insert データ テーブルに新しい行を作成します。 詳細については、「 データベースに新しいレコードを挿入する」を参照してください。
TableAdapter.ClearBeforeFill Fill メソッドのいずれかを呼び出す前に、データ テーブルを空にするかどうかを決定します。

TableAdapter 更新メソッド

TableAdapters は、データ コマンドを使用して、データベースとの間で読み取りと書き込みを行います。 関連付けられたデータ テーブルのスキーマを作成するための基礎として TableAdapter の初期Fill (メイン) クエリと、TableAdapter.Update メソッドに関連付けられているInsertCommandUpdateCommand、およびDeleteCommandコマンドを使用します。 TableAdapter の Update メソッドを呼び出すと、TableAdapter クエリ構成ウィザードで追加した追加のクエリではなく、TableAdapter が最初に構成されたときに作成されたステートメントが実行されます。

TableAdapter を使用すると、通常実行するコマンドと同じ操作が効果的に実行されます。 たとえば、アダプターの Fill メソッドを呼び出すと、アダプターは SelectCommand プロパティでデータ コマンドを実行し、データ リーダー ( SqlDataReader など) を使用して結果セットをデータ テーブルに読み込みます。 同様に、アダプターの Update メソッドを呼び出すと、データ テーブル内の変更された各レコードに対して適切なコマンド ( UpdateCommandInsertCommand、および DeleteCommand プロパティで) が実行されます。

メイン クエリに十分な情報が含まれている場合、デザイナーは TableAdapter を生成するときに、既定で InsertCommandUpdateCommand、および DeleteCommand コマンドを作成します。 ただし、TableAdapter のメイン クエリが 1 つ以上のテーブル SELECT ステートメントである場合、デザイナーはこれらのコマンドを生成できない可能性があります。 このような場合は、 TableAdapter.Update メソッドを実行するとエラーが発生する可能性があります。

TableAdapterのGenerateDbDirectMethods生成メソッド

TableAdapters は、 InsertCommandUpdateCommandDeleteCommandに加えて、データベースに対して直接実行できる次のメソッドを使用して作成されます: TableAdapter.InsertTableAdapter.Update、および TableAdapter.Delete。 これらのメソッドを直接呼び出して、データベース内のデータを操作できます。 つまり、関連付けられているデータ テーブルに対して保留中の挿入、更新、および削除を処理するために TableAdapter.Update を呼び出す代わりに、コードからこれらの個々のメソッドを呼び出すことができます。

これらのダイレクト メソッドを作成しない場合は、[プロパティ] ウィンドウで TableAdapter の GenerateDbDirectMethods プロパティを False に設定します。 TableAdapter に追加される追加のクエリはスタンドアロン クエリであり、これらのメソッドは生成されません。

Nullable 型に対する TableAdapter のサポート

TableAdapters では、null 許容型の Nullable<T>T?がサポートされます。 Visual Basic での null 許容型の詳細については、「 Null 許容値型 (Visual Basic)」を参照してください。 C# の null 許容型の詳細については、「 Null 許容値型 (C#)」を参照してください。

TableAdapterManager リファレンス

既定では、関連テーブルを含むデータセットを作成すると、Visual Studio によって TableAdapterManager クラスが生成されます。 クラスが生成されないようにするには、データセットの Hierarchical Update プロパティの値を falseに変更します。 リレーションシップを持つテーブルを Windows フォームまたは WPF ページのデザインサーフェイスにドラッグすると、Visual Studio はクラスのメンバー変数を宣言します。 データ バインドを使用しない場合は、変数を手動で宣言する必要があります。

TableAdapterManager クラスは .NET 型ではないので、リファレンス ドキュメントには表示されません。 Visual Studio では、データセット作成プロセスの一環として、デザイン時に作成されます。

次の表に、 TableAdapterManager クラスの頻繁に使用されるメソッドとプロパティを示します。

メンバー 説明
UpdateAll メソッド すべてのデータ テーブルのすべてのデータを保存します。
BackUpDataSetBeforeUpdate プロパティ TableAdapterManager.UpdateAllmethod.Booleanを実行する前に、データセットのバックアップ コピーを作成するかどうかを決定します。
tableNameTableAdapter プロパティ TableAdapter を表します。 生成された TableAdapterManager には、それが管理する各 TableAdapter のプロパティが含まれています。 たとえば、Customers テーブルと Orders テーブルを含むデータセットは、 CustomersTableAdapter プロパティと OrdersTableAdapter プロパティを含む TableAdapterManager を使用して生成されます。
UpdateOrder プロパティ 個々の挿入、更新、および削除コマンドの順序を制御します。 このプロパティを、 TableAdapterManager.UpdateOrderOption 列挙体のいずれかの値に設定します。

既定では、 UpdateOrderInsertUpdateDelete に設定されます。つまり、データセット内のすべてのテーブルに対して挿入、更新、削除が実行されます。

セキュリティ

CommandType プロパティを Text に設定してデータ コマンドを使用する場合は、クライアントから送信された情報をデータベースに渡す前に注意深く確認してください。 悪意のあるユーザーは、データベースへの不正アクセスを得るために、変更または追加の SQL ステートメントを送信 (挿入) しようとする可能性があります。 ユーザー入力をデータベースに転送する前に、常に情報が有効であることを確認してください。 可能であれば、パラメーター化されたクエリまたはストアド プロシージャを使用することをお勧めします。