次の方法で共有


方法 : データセットの変更をデータベースに保存する

 

発行: 2016年7月

データセット内のデータを変更して検証したら、更新されたデータをデータベースに戻す必要があります。 変更したデータをデータベースに送信するには、TableAdapter またはデータ アダプターの Update メソッドを呼び出します。 アダプターの Update メソッドによって単一のデータ テーブルが更新され、正しいコマンド (INSERT、UPDATE、または DELETE) がテーブル内の各データ行の RowState に基づいて実行されます。

関連するテーブルのデータを保存する場合、Visual Studio によって TableAdapterManager コンポーネントが作成されます。このコンポーネントは、データベースで定義された外部キー制約に基づく適切な順序で保存を実行するのに役立ちます。 詳細については、「階層更新の概要」を参照してください。

注意

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

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

  1. データベースへの更新情報の送信を試みるコードを、try/catch ブロック内で実行します。

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

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

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

TableAdapter またはデータ アダプターの Update メソッドを呼び出し、データベースに書き込む値があるデータ テーブルの名前を渡します。 単一のデータ テーブルからのデータをデータベースに保存する方法の詳細については、「チュートリアル : データベースへのデータの保存 (単一テーブル)」を参照してください。

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

  • TableAdapter.Update メソッドを、try/catch ブロックで囲みます。 以下の例は、NorthwindDataSet 内の Customers テーブルの内容で更新を試みる方法を示します。

    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
    

データ アダプターを使用してデータベースをデータセットで更新するには

  • DataAdapter.Update メソッドを、try/catch ブロックで囲みます。 以下の例は、DataSet1 内の Table1 の内容で、データ ソースへの更新を試みる方法を示します。

    try
    {
        SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
    }
    catch (Exception e)
    {
        // Error during Update, add code to locate error, reconcile 
        // and try to update again.
    }
    
    Try
        SqlDataAdapter1.Update(Dataset1.Tables("Table1"))
    
    Catch x As Exception
        ' Error during Update, add code to locate error, reconcile 
        ' and try to update again.
    End Try
    

データセットの 2 つの関連テーブルの更新

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

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

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

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

複数のテーブルからのデータを保存する方法の詳細については、「チュートリアル : データベースへのデータの保存 (複数テーブル)」を参照してください。

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

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

  1. 異なるレコードを保持する 3 つの一時 DataTable を作成します。

  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
    

データ アダプターを使用した 2 つの関連するテーブルの更新

  • 各データ アダプターの Update メソッドを呼び出します。

    関連テーブルを含むデータセットによってデータ ソースを更新する方法を次の例に示します。 上の順序に従うために、異なるレコードを保持する 3 つの一時 DataTable が作成されます。 次に、それぞれの行サブセットに対する Update メソッドが try/catch ブロック内から呼び出されます。 更新エラーが発生した場合の推奨される処理方法は、エラーを分岐して解決することです。 続いて、データセットにより変更がコミットされます。 最後に、一時データ テーブルを破棄し、リソースを解放します。

    void UpdateDB()
    {
        System.Data.DataTable DeletedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Deleted);
    
        System.Data.DataTable NewChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Added);
    
        System.Data.DataTable ModifiedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Modified);
    
        try
        {
            if (DeletedChildRecords != null)
            {
                daOrders.Update(DeletedChildRecords);
            }
            if (NewChildRecords != null)
            {
                daOrders.Update(NewChildRecords);
            }
            if (ModifiedChildRecords != null)
            {
                daOrders.Update(ModifiedChildRecords);
            }
    
            dsNorthwind1.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            // Update error, resolve and try again
        }
    
        finally
        {
            if (DeletedChildRecords != null)
            {
                DeletedChildRecords.Dispose();
            }
            if (NewChildRecords != null)
            {
                NewChildRecords.Dispose();
            }
            if (ModifiedChildRecords != null)
            {
                ModifiedChildRecords.Dispose();
            }
        }
    }
    
    Private Sub UpdateDB()
        Dim DeletedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Deleted)
    
        Dim NewChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Added)
    
        Dim ModifiedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Modified)
    
        Try
            If Not DeletedChildRecords Is Nothing Then
                daOrders.Update(DeletedChildRecords)
            End If
    
            daCustomers.Update(dsNorthwind1, "Customers")
    
            If Not NewChildRecords Is Nothing Then
                daOrders.Update(NewChildRecords)
            End If
    
            If Not ModifiedChildRecords Is Nothing Then
                daOrders.Update(ModifiedChildRecords)
            End If
    
            dsNorthwind1.AcceptChanges()
    
        Catch ex As Exception
            ' Update error, resolve and try again
    
        Finally
            If Not DeletedChildRecords Is Nothing Then
                DeletedChildRecords.Dispose()
            End If
    
            If Not NewChildRecords Is Nothing Then
                NewChildRecords.Dispose()
            End If
    
            If Not ModifiedChildRecords Is Nothing Then
                ModifiedChildRecords.Dispose()
            End If
        End Try
    End Sub
    

参照

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