Udostępnij za pośrednictwem


Jak: Zapisz zmiany zestawu danych do bazy danych

Po danych zestawu danych został zmodyfikowany i zatwierdzony, prawdopodobnie chcesz wysyłać zaktualizowane dane z bazą.Aby wysłać zmodyfikowane dane do bazy danych, należy wywołać Update metoda TableAdapter lub karty danych.Karta Update metoda aktualizuje tabelę danych i wykonuje polecenie poprawne (INSERT, UPDATE lub DELETE) oparte na RowState każdego wiersza danych w tabeli.

Podczas zapisywania danych w tabelach pokrewnych, Visual Studio zawiera składnik TableAdapterManager, który pomaga w wykonywaniu zapisuje w prawidłowej kolejności na podstawie ograniczeń klucza obcego, zdefiniowane w bazie danych.Aby uzyskać więcej informacji, zobacz Hierarchiczny przegląd aktualizacji.

[!UWAGA]

Próba aktualizacji źródła danych z zawartością elementu dataset może powodować błędy, należy umieścić kod, który wywołuje karta Update metody wewnątrz try/catch bloku.

Dokładną procedurę aktualizacji źródła danych mogą się różnić w zależności od potrzeb biznesowych, ale aplikacja powinna obejmować następujące kroki:

  1. Wykonanie kodu, która prób wysyłania aktualizacji do bazy danych w try/catch bloku.

  2. Jeśli wyjątek, zlokalizuj wiersz danych, który spowodował błąd.Aby uzyskać więcej informacji, zobacz Jak: zlokalizować wierszy, które zawierają błędy.

  3. Uzgadnianie problem w danych wiersza (programowo, jeżeli jest to możliwe, lub poprzez przedstawienie nieprawidłowy wiersz do użytkownika w celu modyfikacji), a następnie reattempt aktualizacji (HasErrors właściwość, GetErrors metody).

Zapisywanie danych do bazy danych

Wywołanie Update metody TableAdapter lub dane karty, przekazując nazwę tabeli danych zawiera wartości, które mają być zapisane w bazie danych.Aby uzyskać więcej informacji na temat zapisywania danych z tabeli danych z bazą, zobacz Instruktaż: Zapisywanie danych do bazy danych (pojedynczej tabeli).

Aby zaktualizować bazy danych z zestawu danych przy użyciu TableAdapter

  • Należy ująć TableAdapter.Update metody wewnątrz try/catch bloku.Poniższy przykład pokazuje, jak próba aktualizacji z zawartością Customers tabeli 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ć bazy danych z zestawu danych przy użyciu karty danych

  • Należy ująć DataAdapter.Update metody wewnątrz try/catch bloku.Poniższy przykład pokazuje, jak próba aktualizacji źródła danych z zawartością 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 powiązanych tabel w zestawie danych

Aktualizowanie tabel pokrewnych w zestawie danych, jest ważne, aby zaktualizować we właściwej kolejności, aby zmniejszyć prawdopodobieństwo naruszenie ograniczenia integralności referencyjnej.Kolejność wykonywania polecenia będzie również śledzić wskaźniki dla DataRowCollection w zestawie danych.Aby zapobiec podniesionych błędów integralności danych, najlepszym rozwiązaniem jest aktualizacja bazy danych w następującej kolejności:

  1. Tabeli podrzędnej: usuwanie rekordów.

  2. Tabela nadrzędna: wstawiania, aktualizacji i usuwania rekordów.

  3. Tabeli podrzędnej: wstawianie i aktualizacja rekordów.

Aby uzyskać szczegółowe informacje na temat zapisywania danych z wielu tabel, zobacz Instruktaż: Zapisywanie danych do bazy danych (wielu tabel).

Aktualizowane są dwa lub więcej powiązanych tabel, należy uwzględnić wszystkie logikę aktualizacji w obrębie transakcji.Transakcja jest procesem, który gwarantuje wszystkich powiązanych zmiany w bazie danych są pomyślne przed wykonaniem jakichkolwiek zmian.Aby uzyskać więcej informacji, zobacz Performing Transactions.

Aby zaktualizować powiązanych tabel za pomocą TableAdapter

  1. Utwórz tymczasowe trzy DataTables do przechowywania różnych rekordów.

  2. Wywołanie Update metody każdy podzbiór wierszy z poziomu try/catch bloku.Wystąpią błędy aktualizacji kursu sugerowane działania jest gałęzie i je rozwiązać.

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

  4. Pozbądź się tabele tymczasowe dane, aby zwolnić 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ć powiązanych tabel za pomocą karty danych

  • Wywołanie Update metoda każdej karty danych.

    Poniższy przykład pokazuje sposób aktualizacji źródła danych z zestawu danych, który zawiera tabele powiązane relacją.Aby sekwencją powyższe, tymczasowe trzy DataTables zostanie utworzony do przechowywania różnych rekordów.Następnie Update dla każdego podzbiór wierszy, w programie będzie można wywołać metody try/catch bloku.Wystąpią błędy aktualizacji kursu sugerowane działania jest gałęzie i je rozwiązać.Następnie obiekt dataset zatwierdza zmiany.Wreszcie należy dysponować tabel tymczasowych danych, aby zwolnić 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

Co nowego w projektowaniu danych aplikacji w Visual Studio 2012

Wiązanie formantów Windows Forms do danych w programie Visual Studio

Przygotowanie aplikacji do odbierania danych

Pobieranie danych do aplikacji

Wiązanie formantów z danych w programie Visual Studio

Edytowanie danych w aplikacji

Sprawdzanie poprawności danych

Zapisywanie danych

Inne zasoby

Instruktaże danych

Połączenie z danymi w programie Visual Studio