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:
Kód, který se pokusí odeslat aktualizaci do databáze by se měl provést v bloku try/catch.
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.
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í:
Podřízená tabulka: odstranění záznamů.
Nadřazená tabulka: vložení, aktualizace a odstranění záznamů.
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
Vytvořte tři dočasné objekty typu DataTablepro uložení různých záznamů.
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í.
Potvrďte změny datové sady do databáze.
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
Vázání ovládacích prvků k datům v sadě Visual Studio
Upravování dat ve vaší aplikaci