Sdílet prostřednictvím


Postupy: Uložení změn datové sady do databáze

Poté, co byla data ve vaší datové sadě změněna a ověřena, budete pravděpodobně chtít aktualizovaná data odeslat zpět do databáze.Pokud chcete upravená data odeslat do databáze, zavolejte metodu Update komponenty TableAdapter nebo datového adaptéru.Metoda Update tohoto adaptéru aktualizuje jednu datovou tabulku a provede správný příkaz (INSERT, UPDATE nebo DELETE) na základě vlastnosti RowState každého řádku dat v tabulce.

Při ukládání dat v souvisejících tabulkách, systém Visual Studio poskytuje komponentu TableAdapterManager, která usnadňuje ukládání ve správném pořadí podle omezení cizího klíče definovaného v databázi.Další informace naleznete v tématu Přehled hierarchické aktualizace.

[!POZNÁMKA]

Protože pokus o aktualizaci zdroje dat obsahem datové sady může mít za následek chyby, měli byste kód, který volá metodu Update adaptéru, umístit do bloku try/catch.

Přesný postup aktualizace zdroje dat se může lišit podle potřeb uživatele, ačkoliv aplikace by měla zahrnovat následující kroky:

  1. Kód, který se pokusí odeslat aktualizaci do databáze by se měl provést v bloku try/catch.

  2. Jestliže je zachycena výjimka, vyhledejte řádek dat způsobující chybu.Další informace naleznete v tématu Postupy: Vyhledání řádků s chybami.

  3. Opravte problém v tomto řádku dat (programově, pokud je to možné nebo nechte neplatný řádek opravit uživatelem) a poté se znovu pokuste o aktualizaci ( vlastnostHasErrors , metoda GetErrors ).

Ukládání dat do databáze

Zavolejte metodu Update komponenty TableAdapter nebo datového adaptéru a předejte název tabulky dat obsahující hodnoty, které mají být zapsány do databáze.Další informace o ukládání dat z jedné tabulky zpět do databáze naleznete v tématu Návod: Ukládání dat do databáze (jediná tabulka).

Chcete-li aktualizovat databázi pomocí datové sady a komponenty TableAdapter

  • Uzavřete metodu TableAdapter.Update do bloku try/catch.Následující příklad se pokouší provést aktualizaci obsahem tabulky Customers v datové sadě 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");
    }
    

Chcete-li aktualizovat databázi pomocí datové sady a datového adaptéru

  • Uzavřete metodu DataAdapter.Update do bloku try/catch.Následující příklad se pokouší o aktualizaci zdroje dat obsahem tabulky Table1 v datové sadě 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.
    }
    

Aktualizace dvou souvisejících tabulek v datové sadě

Při aktualizaci souvisejících tabulek v datové sadě je nutné aktualizaci provést ve správném pořadí, aby se snížila možnost narušení omezení referenční integrity.Pořadí spuštění příkazu bude následovat příznaky DataRowCollection v datové sadě.Chcete-li zabránit chybám integrity dat, je nejlepší provést aktualizaci databáze v následujícím pořadí:

  1. Podřízená tabulka: odstranění záznamů.

  2. Nadřazená tabulka: vložení, aktualizace a odstranění záznamů.

  3. Podřízená tabulka: vložení a aktualizace záznamů.

Podrobné informace o ukládání dat z více tabulek naleznete v tématu Návod: Ukládání dat do databáze (více tabulek).

Při aktualizaci dvou nebo více souvisejících tabulek byste měli provést všechny logiku aktualizace v rámci transakce.Transakce je proces, který zajišťuje, že před provedením jakékoli změny budou všechny související změny v databázi úspěšné.Další informace naleznete v tématu Transactions and Concurrency.

Chcete-li aktualizovat dvě související tabulky pomocí komponenty TableAdapter

  1. Vytvořte tři dočasné objekty typu DataTablepro uložení různých záznamů.

  2. Pro každou podmnožinu řádků zavolejte metodu Update uvnitř bloku try/catch.Pokud dojde k chybám aktualizace, doporučený postup je jejich větvení a vyřešení.

  3. Potvrďte změny datové sady do databáze.

  4. Uvolněte prostředky uvolněním dočasných datových tabulek.

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

Chcete-li aktualizovat dvě související tabulky pomocí datového adaptéru

  • Zavolejte metodu Update každého datového adaptéru.

    Následující příklad ukazuje, jak aktualizovat zdroj dat pomocí datové sady, která obsahuje související tabulky.Podle výše uvedeného budou vytvořeny tří dočasné objekty typu DataTableuchovávající odlišné záznamy.Poté bude uvnitř bloku try/catch zavolána metoda Update pro každou podmnožinu řádků.Pokud dojde k chybám aktualizace, doporučený postup je jejich větvení a vyřešení.Datová sada poté potvrdí změny.Nakonec uvolněte prostředky uvolněním dočasných datových tabulek.

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

Viz také

Koncepty

Vázání ovládacích prvků Windows Forms k datům v sadě Visual Studio

Příprava vaší aplikace k příjmu dat

Načítání dat do vaší aplikace

Vázání ovládacích prvků k datům v sadě Visual Studio

Upravování dat ve vaší aplikaci

Ověřování dat

Ukládání dat

Další zdroje

Návody k datům

Připojení k datům v sadě Visual Studio