アプリケーションのデータをデータベースに保存し直すことは、データのテーブルが 1 つのみで、外部キー制約を考慮する必要がない場合は非常に簡単です。 ただし、複数の関連データ テーブルを含むデータセットからデータを保存する場合は、制約に違反しないように特定の順番で変更内容をデータベースに送信する必要があります。 関連テーブルで変更したデータを更新する場合は、各データ テーブルからデータのサブセットを抽出し、正しい順番でデータベースに更新を送信するプログラム ロジックを用意します。または、TableAdapterManager コンポーネントを使用することもできます。
このチュートリアルでは、TableAdapterManager コンポーネントを使用して関連データを保存する方法について説明します。 手動による関連データ テーブル更新のコーディングについては、「チュートリアル : データベースへのデータの保存 (複数テーブル)」を参照してください。
必須コンポーネント
このチュートリアルを完了するには、次の条件が必要です。
- Northwind サンプル データベースにアクセスします。 詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
Windows ベース アプリケーションの作成
このチュートリアルでは、最初に新しい Windows ベースのアプリケーションを作成します。
新しい Windows ベースのアプリケーションを作成するには
[ファイル] メニューで新しいプロジェクトを作成します。
注意
階層更新は、Visual Basic プロジェクトと C# プロジェクトでサポートされているため、新しいプロジェクトはこのどちらかの言語で作成してください。
プロジェクトに HierarchicalUpdateWalkthrough という名前を付けます。
[Windows フォーム アプリケーション] をクリックし、[OK] をクリックします。 詳細については、「.NET Framework を使用したクライアント アプリケーションの開発」を参照してください。
HierarchicalUpdateWalkthrough プロジェクトが作成され、ソリューション エクスプローラーに追加されます。
データセットの作成
階層更新を実行するには関連テーブルが必要となるため、次の手順では、Northwind データベースの Customers テーブルと Orders テーブルを含むデータセットを作成します。 データ ソース構成ウィザードを実行して、データセットを作成します。 接続を作成するには、Northwind サンプル データベースへのアクセス権を持っている必要があります。 Northwind サンプル データベースの設定方法については、「方法 : サンプル データベースをインストールする」を参照してください。
データセットを作成するには
[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックしてデータ ソース構成ウィザードを起動します。
[データ ソースの種類を選択] ページで、[データベース] をクリックし、[次へ] をクリックします。
[データ接続の選択] ページで、次のいずれかの操作を行います。
Northwind サンプル データベースへのデータ接続がドロップダウン リスト ボックスに表示されている場合は、これをクリックします。
または
[新しい接続] をクリックして [接続の追加] または [接続の変更] ダイアログ ボックスを開きます。
データベースにパスワードが必要な場合は、該当するオプションを選択して重要情報を含め、[次へ] をクリックします。
[アプリケーション構成ファイルへの接続文字列を保存] ページで、[次へ] をクリックします。
[データベース オブジェクトの選択] ページの [テーブル] ノードを展開します。
Customers テーブルと Orders テーブルに該当するチェック ボックスをオンにし、[完了] をクリックします。
プロジェクトに NorthwindDataSet が作成されて追加され、[データ ソース] ウィンドウにテーブルが表示されます。
作成される既定のデータ バインド コントロールの変更
[データ ソース] ウィンドウで設定を行った後、Windows フォームに項目をドラッグしたときに作成されるコントロールを選択できます。 このチュートリアルでは、Customers テーブルのデータを個別のコントロール ([詳細]) に表示します。 Orders テーブルのデータは、DataGridView コントロール (DataGridView) に表示します。
[データ ソース] ウィンドウの項目のコントロールを設定するには
[データ ソース] ウィンドウの [Customers] ノードを展開します。
[Customers] ノードのコントロール リストの [詳細] をクリックし、Customers テーブルに対して作成されるコントロールを個別のコントロールに変更します。 詳細については、「方法 : [データ ソース] ウィンドウからドラッグしたときに作成されるコントロールを設定する」を参照してください。
注意
Orders テーブルは、既定のコントロール DataGridView を使用します。
データ バインド フォームの作成
[データ ソース] ウィンドウでコントロールを選択したら、フォームに項目をドラッグしてデータ バインド コントロールを作成します。
Customers データと Orders データのデータ バインド コントロールを作成するには
[データ ソース] ウィンドウから Form1 にメインの [Customers] ノードをドラッグします。
説明のラベルが付いたデータ バインド コントロールが、レコード間を移動するためのツール バー (BindingNavigator) である TableAdapterManager コンポーネントと共にフォームに表示されます。 型指定された DataSet、TableAdapter、および BindingSource がコンポーネント トレイに表示されます。
[データ ソース] ウィンドウから Form1 に [Orders] ノードをドラッグします。
注意
関連する [Orders] ノードは Customers テーブルの [Fax] ノードの下にあり、[Customers] ノードの子ノードです。[Customers] ノードのピアとして表示される [Orders] ノードは、テーブル内のすべての注文を表します。[Customers] ノードの子ノードとして表示される [Orders] ノードは、関連する注文を表します。
DataGridView コントロールと、レコード間を移動するためのツール バー (BindingNavigator) がフォームに表示されます。 コンポーネント トレイに TableAdapter と BindingSource が表示されます。
階層更新を実行するように生成された保存コードの変更
データセットでの関連データ テーブルへの変更をデータベースに保存するには、TableAdapterManager.UpdateAll メソッドを呼び出し、関連テーブルが含まれるデータセットの名前を渡します。 たとえば、NorthwindDataset 内のすべてのテーブルの更新をバックエンドのデータベースに送信するには、TableAdapterManager.UpdateAll(NorthwindDataset) メソッドを実行します。
[データ ソース] ウィンドウから項目をドロップすると、各テーブルにデータを読み込むコード (TableAdapter.Fill メソッド) が Form_Load イベントに自動的に追加されます。 BindingNavigator の [保存] ボタン クリック イベントにも、データセットのデータをデータベースに保存するコード (TableAdapterManager.UpdateAll メソッド) が追加されます。
生成された保存コードには、CustomersBindingSource.EndEdit メソッドを呼び出すコード行も含まれています。 これは、具体的には、フォームに最初に追加された BindingSource の EndEdit メソッドを呼び出します。 つまり、このコードは、[データ ソース] ウィンドウからフォームに最初にドラッグしたテーブルに対してのみ生成されます。 EndEdit 呼び出しは、現在編集中のデータ バインド コントロールで実行されている変更をコミットします。 したがって、あるデータ バインド コントロールにフォーカスがある状態で [保存] ボタンをクリックすると、実際の保存 (TableAdapterManager.UpdateAll メソッド) が実行される前に、そのコントロール内のすべての保留中の編集がコミットされます。
注意
デザイナーは、フォームに最初にドロップされたテーブルに対してのみ BindingSource.EndEdit コードを追加します。したがって、フォーム上の各関連テーブルに対して、BindingSource.EndEdit メソッドを呼び出すコード行を手動で追加する必要があります。つまり、このチュートリアルでも、OrdersBindingSource.EndEdit メソッドの呼び出しを追加する必要があります。
保存前に、関連テーブルへの変更をコミットするコードを更新するには
BindingNavigator の [保存] ボタンをダブルクリックし、コード エディターで Form1 を開きます。
CustomersBindingSource.EndEdit メソッドを呼び出す行の後に、OrdersBindingSource.EndEdit メソッドを呼び出すコード行を追加します。 [保存] ボタン クリック イベントのコードは、次のようになります。
Me.Validate() Me.CustomersBindingSource.EndEdit() Me.OrdersBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)
this.Validate(); this.customersBindingSource.EndEdit(); this.ordersBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.northwindDataSet);
データベースにデータを保存する前に関連子テーブルに対する変更をコミットするだけでなく、新しい子レコードをデータセットに追加する前に、新しく作成された親レコードをコミットすることが必要な場合もあります。 つまり、外部キー制約により、新しい子レコード (Orders) をデータセットに追加する前に、データセットに新しい親レコード (Customer) を追加することが必要な場合もあります。 この操作を行うには、子 BindingSource.AddingNew イベントを使用します。
注意
新しい親レコードをコミットする必要があるかどうかは、データ ソースのバインドに使用されるコントロールの種類によって異なります。このチュートリアルでは、親テーブルとのバインドに個別のコントロールを使用するため、新しい親レコードをコミットするコードを追加する必要があります。親レコードが DataGridView のような複雑なバインド コントロールに表示される場合は、親レコードに対するこの追加の EndEdit 呼び出しは必要ありません。これは、コントロールの基になるデータバインド機能によって、新しいレコードのコミットが行われるためです。
データセットで新しい子レコードを追加する前に親レコードをコミットするコードを追加するには
OrdersBindingSource.AddingNew イベントのイベント ハンドラーを作成します。
- デザイン ビューで Form1 を開いて、コンポーネント トレイの OrdersBindingSource をクリックし、[プロパティ] ウィンドウで [イベント] を選択して、AddingNew イベントをダブルクリックします。
CustomersBindingSource.EndEdit メソッドを呼び出すコード行をイベント ハンドラーに追加します。 OrdersBindingSource_AddingNew イベント ハンドラー内のコードは、次のようになります。
Me.CustomersBindingSource.EndEdit()
this.customersBindingSource.EndEdit();
階層更新の有効性の確認
階層更新は、データセットの [階層更新] プロパティを設定することによって、有効と無効を切り替えます。 階層更新は既定で有効になっているため、このチュートリアルで [階層更新] プロパティの値を変更する必要はありません。
階層更新が有効になっていることを確認するには
ソリューション エクスプローラーで NorthwindDataSet.xsd ファイルをダブルクリックし、データセットをデータセット デザイナーで開きます。
デザイン サーフェス上の空の領域を選択します。
[プロパティ] ウィンドウで [階層更新] プロパティを見つけ、True に設定されていることを確認します。
注意
[階層更新] プロパティの設定では、TableAdapterManager と階層更新を実行するロジックを使用してコードを生成するかどうかが制御されます。[階層更新] を True に設定すると、TableAdapterManager が生成され、[階層更新] を False に設定すると、TableAdapterManager は生成されません。
アプリケーションのテスト
アプリケーションをテストするには
F5 キーを押します。
各テーブルの 1 つ以上のレコードのデータを変更します。
新しい顧客を追加し、次に、この顧客に対して新しい注文を追加します。
[データの保存] をクリックします。 TableAdapterManager によって、関連するすべての更新に必要なロジックが処理されます。
データベースの値をチェックし、各テーブルに変更が保存されたことを確認します。
次の手順
Windows ベース アプリケーションに関連データを保存した後で、アプリケーションの要件によってはさらに操作を追加する必要があります。 このアプリケーションで行うことができる拡張には次のものがあります。
3 番目のテーブル (OrderDetails テーブルなど) を追加し、3 つのテーブル階層を試してみる。
データがデータベース制約に加えてアプリケーション要件を満たしていることを検証する検証コードを追加する。 詳細については、「データの検証」を参照してください。
参照
処理手順
方法 : データの保存前にデータ バインド コントロールで実行中の編集をコミットする
方法 : 既存の Visual Studio プロジェクトで階層更新を実装する
チュートリアル : 関連するデータ テーブルからのデータの保存 (階層更新)