方法 : TableAdapter を使用してデータを更新する

更新 : 2011 年 4 月

データセット内のデータを変更して検証したら、更新されたデータをデータベースに戻す必要があります。 変更したデータをデータベースに送信するには、TableAdapter の Update メソッドを呼び出します。 アダプターの Update メソッドによって単一のデータ テーブルが更新され、正しいコマンド (INSERT、UPDATE、または DELETE) がテーブル内の各データ行の RowState に基づいて実行されます。 関連するテーブルのデータを保存する場合は、Visual Studio によって TableAdapterManager コンポーネントが作成されます。このコンポーネントは、データベースで定義された外部キー制約に基づく適切な順序で保存を実行するときに役立ちます。 詳細については、「階層更新の概要」を参照してください。

注意

データセットの内容でデータ ソースを更新しようとするとエラーが発生する場合があるため、アダプターの Update メソッドを呼び出すコードは try/catch ブロック内に配置する必要があります。

データ ソースを更新する実際の手順はビジネス ニーズによって異なる場合がありますが、アプリケーションでは次の手順に従う必要があります。

  1. try/catch ブロック内にあるアダプターの Update メソッドを呼び出します。

  2. 例外が検出された場合は、エラーを引き起こしたデータ行を探します。 詳細については、「方法 : エラーが発生している行を探す」を参照してください。

  3. データ行の問題を調整し (可能な場合はプログラムで調整し、可能でない場合は修正のためにユーザーに無効な行を表示する)、もう一度更新してみます (HasErrorsGetErrors)。

データベースへのデータの保存

TableAdapter の Update メソッドを呼び出し、データベースに書き込まれる値を含むデータ テーブルの名前を渡します。

重要

ローカル データベース (.mdf ファイルなど) を使用する場合は、ファイルの [出力ディレクトリにコピー] プロパティを [常にコピーする] に設定しないでください。 このプロパティが [常にコピーする] に設定されていると、プロジェクトをビルドしたときに、ローカル データベースに対して行った変更がすべて上書きされます。 この問題を解決するには、ソリューション エクスプローラーでファイルを右クリックし、[プロパティ] をクリックして、[出力ディレクトリにコピー] の値を変更します。

TableAdapter を使用して、データセットが存在するデータベースを更新するには

  • Update メソッドを try/catch ブロックで囲みます。 try/catch ブロック内で NorthwindDataSet の Customers テーブルの内容を更新する方法の例を次に示します。

    Try
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers)
        MsgBox("Update successful")
    
    Catch ex As Exception
        MsgBox("Update failed")
    End Try
    
    try
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.customersTableAdapter.Update(this.northwindDataSet.Customers);
        MessageBox.Show("Update successful");
    }
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    

TableAdapter によるデータセット内の 2 つの関連テーブルの更新

データセットの関連テーブルを更新する場合は、適切な順序で更新し、参照整合性の制約に違反する可能性を小さくする必要があります。 コマンド実行の順序も、データセットの DataRowCollection のインデックスに従います。 データの整合性エラーが発生しないようにするには、最も適切な方法として、次の順序でデータベースを更新します。

  1. 子テーブル : レコードを削除する。

  2. 親テーブル : レコードを挿入、更新、および削除する。

  3. 子テーブル : レコードを挿入および更新する。

    注意

    複数の関連テーブルを更新する場合、トランザクション内にすべての更新ロジックを含める必要があります。 トランザクションは、変更をコミットする前に、関連するすべての変更を正しくデータベースに反映できることを確認するプロセスです。 詳細については、「トランザクションと同時実行 (ADO.NET)」を参照してください。

TableAdapter を使用して 2 つの関連テーブルを更新するには

  1. 3 つの一時データ テーブルを作成して異なるレコードを格納します。

  2. try/catch ブロックから、それぞれの行サブセットに対する Update メソッドを呼び出します。 更新エラーが起きた場合は、エラーを分岐して解決する必要があります。

  3. データベースに変更内容をコミットします。

  4. 一時データ テーブルを破棄し、リソースを解放します。

    関連テーブルを含むデータセットによってデータ ソースを更新する方法を次の例に示します。

    Private Sub UpdateDB()
        Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
        Dim newChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
        Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
        Try
            If deletedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(deletedChildRecords)
            End If
    
            CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
            If newChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(newChildRecords)
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(modifiedChildRecords)
            End If
    
            NorthwindDataSet.AcceptChanges()
    
        Catch ex As Exception
            MessageBox.Show("An error occurred during the update process")
            ' Add code to handle error here.
    
        Finally
            If deletedChildRecords IsNot Nothing Then
                deletedChildRecords.Dispose()
            End If
    
            If newChildRecords IsNot Nothing Then
                newChildRecords.Dispose()
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                modifiedChildRecords.Dispose()
            End If
    
        End Try
    End Sub
    
    void UpdateDB()
    {
        NorthwindDataSet.OrdersDataTable deletedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        NorthwindDataSet.OrdersDataTable newChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        NorthwindDataSet.OrdersDataTable modifiedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
        try
        {
            if (deletedChildRecords != null)
            {
                ordersTableAdapter.Update(deletedChildRecords);
            }
    
            customersTableAdapter.Update(northwindDataSet.Customers);
    
            if (newChildRecords != null)
            {
                ordersTableAdapter.Update(newChildRecords);
            }
    
            if (modifiedChildRecords != null)
            {
                ordersTableAdapter.Update(modifiedChildRecords);
            }
    
            northwindDataSet.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            MessageBox.Show("An error occurred during the update process");
            // Add code to handle error here.
        }
    
        finally
        {
            if (deletedChildRecords != null)
            {
                deletedChildRecords.Dispose();
            }
            if (newChildRecords != null)
            {
                newChildRecords.Dispose();
            }
            if (modifiedChildRecords != null)
            {
                modifiedChildRecords.Dispose();
            }
        }
    }
    

参照

概念

TableAdapter の概要

Visual Studio でのデータへの Windows フォーム コントロールのバインド

Visual Studio でのデータへのコントロールのバインド

その他の技術情報

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

Visual Studio でのデータへの接続

アプリケーションでデータを受け取る準備

アプリケーションへのデータのフェッチ

アプリケーションでのデータ編集

データの検証

データの保存

履歴の変更

日付

履歴

理由

2011 年 4 月

ローカル データベース ファイルの [出力ディレクトリにコピー] の設定での考えられる問題に対処。

カスタマー フィードバック