Udostępnij za pośrednictwem


Porady: zapisywanie zmian w zestawie danych w bazie danych

Gdy dane w zestawie danych będą już zmodyfikowane i zwalidowane, można wysłać zaktualizowaną ich wersję z powrotem do bazy danych.Aby wysłać zmodyfikowane dane do bazy danych, wywołaj metodę Update z TableAdapter lub adaptera danych.Metoda Update adaptera aktualizuje pojedynczą tabelę danych i wykonuje poprawne polecenie (INSERT, UPDATE lub DELETE) w oparciu o RowState każdego wiersza w tabeli.

Do zapisywania danych w powiązanych tabelach, Visual Studio dostarcza składnik TableAdapterManager, który pomaga w wykonywaniu zapisów w odpowiedniej kolejności, opartej na ograniczeniach kluczy obcych zdefiniowanych w bazie danych.Aby uzyskać więcej informacji, zobacz Hierarchiczna aktualizacja — Przegląd.

[!UWAGA]

Ponieważ próba zaktualizowania źródła danych zawartością zestawu danych może zwrócić błędy, należy umieścić kod wywołania metody Update adaptera wewnątrz bloku try/catch.

Dokładna procedura zaktualizowania źródła danych może różnić się w zależności od potrzeb biznesowych, ale aplikacja powinna zawierać poniższe kroki:

  1. Wykonaj kod, który próbuje wysłać aktualizacje do bazy danych wewnątrz bloku try/catch.

  2. Jeśli złapany jest wyjątek, zlokalizuj wiersz danych, który spowodował błąd.Aby uzyskać więcej informacji, zobacz Porady: lokalizowanie wierszy zawierających błędy.

  3. Uzgodnij problem w wierszu danych (programowo jeśli to możliwe, lub poprzez prezentację użytkownikowi niepoprawnego wiersza do modyfikacji), a następnie spróbuj ponownie zaktualizować (właściwość HasErrors, metoda GetErrors).

Zapisywanie danych w bazie danych

Wywołaj metodę Update z TableAdapter lub adaptera danych, przekazując nazwę tabeli danych, która zawiera wartości do zapisania w bazie danych.Aby uzyskać więcej informacji o zapisywaniu danych z pojedynczej tabeli danych z powrotem do bazy danych, zobacz Wskazówki: zapisywanie danych w bazie danych (Single Table).

Aby zaktualizować bazę danych zestawem danych za pomocą TableAdapter

  • Umieść metodę TableAdapter.Update wewnątrz bloku try/catch.Poniższy przykład przedstawia sposób wykonania próby aktualizacji zawartością tabeli Customers w NorthwindDataSet.

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

Aby zaktualizować bazę danych zestawem danych za pomocą adaptera danych

  • Umieść metodę DataAdapter.Update wewnątrz bloku try/catch.Poniższy przykład przedstawia sposób wykonania próby aktualizacji źródła danych zawartością tabeli Table1 w DataSet1.

    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
    
    try
    {
        SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
    }
    catch (Exception e)
    {
        // Error during Update, add code to locate error, reconcile  
        // and try to update again.
    }
    

Aktualizowanie dwóch powiązanych tabel w zestawie danych

Podczas aktualizacji powiązanych tabel w zestawie danych, ważne jest aktualizowanie ich w odpowiedniej sekwencji, aby zmniejszyć szansę naruszenia ograniczeń więzów integralności.Kolejność wykonywania poleceń, będzie także zgodna ze wskazaniami DataRowCollection w zestawie danych.Aby zapobiec powstawaniu błędów integralności danych, najlepszą praktyką jest aktualizowanie bazy danych w następującej sekwencji:

  1. Tabela podrzędna: usuń rekordy.

  2. Tabela nadrzędna: wstaw, zaktualizuj i usuń rekordy.

  3. Tabela podrzędna: wstaw i zaktualizuj rekordy.

Aby uzyskać bardziej szczegółowe informacje o zapisywaniu danych z wielu tabel, zobacz Wskazówki: zapisywanie danych w bazie danych (wiele tabel).

Jeśli aktualizujesz dwie lub więcej powiązanych tabel, musisz uwzględnić je wszystkie w logice aktualizacji wewnątrz transakcji.Transakcja jest procesem, który zapewnia, że wszystkie powiązane zmiany w bazie danych zostaną wykonane pomyślnie, przed zatwierdzeniem jakichkolwiek zmian.Aby uzyskać więcej informacji, zobacz Transactions and Concurrency.

Aby zaktualizować dwie powiązane tabele za pomocą TableAdapter

  1. Utwórz trzy tymczasowe DataTable do przechowywania różniących się rekordów.

  2. Wywołaj metodę Update dla każdego podzbioru wierszy wewnątrz bloku try/catch.Jeśli wystąpią błędy aktualizacji, sugerowanym działaniem jest rozdzielenie gałęzi i rozwiązanie ich.

  3. Zatwierdź zmiany z zestawu danych do bazy danych.

  4. Usuń tymczasowe tabele danych, aby uwolnić zasoby.

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

Aby zaktualizować dwie powiązane tabele za pomocą adaptera danych.

  • Wywołaj metodę Update dla każdego adaptera danych.

    Poniższy przykład przedstawia sposób aktualizacji źródła danych przy pomocy zestawu danych, który zawiera powiązane tabele.Aby postępować zgodnie z powyższą sekwencją, zostaną utworzone trzy tymczasowe DataTable do przechowywania różniących się rekordów.Następnie zostanie wywołana metoda Update dla każdego podzbioru wierszy wewnątrz bloku try/catch.Jeśli wystąpią błędy aktualizacji, sugerowanym działaniem jest rozdzielenie gałęzi i rozwiązanie ich.Następnie zestaw danych zatwierdza zmiany.Na koniec, usuń tymczasowe tabele danych, aby uwolnić zasoby.

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

Zobacz też

Koncepcje

Powiązywanie formantów formularzy systemu Windows z danymi w Visual Studio

Przygotowywanie aplikacji na otrzymywanie danych

Pobieranie danych do aplikacji

Powiązywanie kontrolek z danymi w Visual Studio

Edytowanie danych w aplikacji

Sprawdzanie poprawności danych

Zapisywanie danych

Inne zasoby

Wskazówki dotyczące danych

Łączenie z danymi w Visual Studio