次の方法で共有


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

 

公開日: 2016年4月

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

注意

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    注意

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

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

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

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

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

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

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

            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();
                    }
                }
            }
    
        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
    

参照

TableAdapter の概要
データに関するチュートリアル
Visual Studio でのデータへの Windows フォーム コントロールのバインド
Visual Studio でのデータへの接続
アプリケーションでデータを受け取る準備
アプリケーションへのデータのフェッチ
Visual Studio でのデータへのコントロールのバインド
アプリケーションでのデータ編集
データの検証
データの保存