階層更新の概要
更新 : 2007 年 11 月
階層更新とは、参照整合性規則を保持しながら、複数の関連テーブルで構成されるデータセットから更新データをデータベースに保存することです。参照整合性とは、関連レコードの挿入、更新、および削除を制御するデータベース内の外部キー制約によって定義される一貫性規則のことです。たとえば、顧客レコードを先に作成していない場合はその顧客の注文を作成できないようにすることが参照整合性です。
Visual Studio 2005 および以前のバージョンでは、開発者がデータ アプリケーションを作成すると、自動生成されたコードは [データ ソース] ウィンドウからドラッグされた最初のテーブルで変更されたデータのみを保存しました。[データ ソース] ウィンドウから追加のテーブルをドラッグした場合、ユーザーはそれらのテーブルでの変更内容をデータベースに保存するコードを手動で追加する必要がありました。ユーザーはテーブルごとに TableAdapter.Update メソッドを呼び出すコードのみを追加するだけでなく、テーブルごとに特定の挿入、更新、および削除を適切な順序で実行するロジックを組み込んで、参照整合性の違反を防ぐ必要がありました (たとえば、新しい顧客の注文を追加する前にその顧客を保存する必要があり、既存の顧客を削除する前にその注文を削除する必要がありました)。
Visual Studio 2008 では、型指定されたデータセットが新しい TableAdapterManager コンポーネントにより強化されました。TableAdapterManager により、多数のコード行を持つ複数のルーチンから単一のメソッド呼び出し TableAdapterManager.UpdateAll(TypedDataset) への関連テーブルにデータを保存するのに必要なコードが減少しました。TableAdapterManager には、データセットとデータベースの間で更新 (保存) 操作を行う際に参照整合性を保持するのに必要な、基になるロジックが備わっています。詳細については、「TableAdapterManager の概要」を参照してください。
データセットでの階層更新の有効化
プロジェクトで追加または作成されたすべての新しいデータセットでは、階層更新が既定で有効になっています。階層更新は、データセット デザイナで型指定されたデータセットの "階層更新" プロパティを True または False に設定することにより、オンまたはオフにできます。詳細については、「方法 : 階層更新を有効または無効にする」を参照してください。
外部キー制約と連鎖更新および連鎖削除
生成されたデータセット コードで、データベースでの外部キー制約と連鎖動作がどのように作成されるかを理解することは重要です。
既定では、データセットのデータ テーブルは、データベースでのリレーションシップと一致するリレーションシップ (DataRelation) が設定された状態で生成されます。ただし、データセットでのリレーションシップは、外部キー制約としては生成されません。DataRelation は、UpdateRule または DeleteRule が有効でない状態で [リレーションシップのみ] として構成されます。
連鎖更新と連鎖削除は、データベースのリレーションシップで連鎖更新や連鎖削除が有効になっている場合でも、既定で無効になっています。たとえば、新しい顧客と新しい注文を作成した後データを保存しようとすると、データベースで定義された外部キー制約との競合が発生することがあります。詳細については、「方法 : データセットでの外部キー制約を構成する」を参照してください。
更新を実行する順序の設定
更新を実行する順序を設定すると、データセットのすべてのテーブルで変更されたすべてのデータを保存するのに必要な個々の挿入、更新、および削除の順序が設定されます。階層更新が有効な場合、まず挿入が実行され、次に更新、削除の順で実行されます。TableAdapterManager には、更新、挿入、削除の順に実行できる UpdateOrder プロパティも用意されています。
メモ : |
---|
更新順序にはすべてが含まれていることを理解することが重要です。つまり、更新が実行されるとき、データセットのすべてのテーブルに対して挿入が実行され、次にデータセットのすべてのテーブルに対して更新が実行され、最後にデータセットのすべてのテーブルに対して削除が実行されるということを理解してください。 |
UpdateOrder プロパティを設定するには、[データ ソース] ウィンドウからフォームに項目をドラッグした後、コンポーネント トレイで TableAdapterManager をクリックし、[プロパティ] ウィンドウで UpdateOrder プロパティを設定します。詳細については、「方法 : 階層更新の実行順序を設定する」を参照してください。
階層更新を実行する前のデータセットのバックアップ コピーの作成
データを保存すると (TableAdapterManager.UpdateAll() メソッドを呼び出すことにより)、TableAdapterManager は単一のトランザクションで各テーブルのデータの更新を試みます。任意のテーブルの更新時に、なんらかが失敗した場合、トランザクション全体がロールバックされます。ほとんどの状況では、トランザクションをロールバックするとアプリケーションが元の状態に戻ります。ただし、バックアップ コピーからデータセットを復元することもできます。1 つの例は、自動インクリメント値を使用している場合です。たとえば、保存処理に失敗した場合、データセットで自動インクリメント値はリセットされませんが、データセットは自動インクリメント値の作成を続行します。これにより、番号の途切れが生じてアプリケーションで受け入れられない可能性があります。これが問題となる状況では、TableAdapterManager に備わっている BackupDataSetBeforeUpdate プロパティを使用して、トランザクションが失敗した場合に既存のデータセットをバックアップ コピーと置き換えることができます。
メモ : |
---|
バックアップ コピーは、TableAdapterManager.UpdateAll メソッドの実行中はメモリ内にのみ存在します。したがって、このバックアップ データセットは元のデータセットを置き換えるか、TableAdapterManager.UpdateAll メソッドが実行を終了するとすぐにスコープの外に出るため、このバックアップ データセットにプログラムからアクセスすることはできません。 |
参照
処理手順
チュートリアル : 関連するデータ テーブルからのデータの保存 (階層更新)