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:
Wykonaj kod, który próbuje wysłać aktualizacje do bazy danych wewnątrz bloku try/catch.
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.
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:
Tabela podrzędna: usuń rekordy.
Tabela nadrzędna: wstaw, zaktualizuj i usuń rekordy.
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
Utwórz trzy tymczasowe DataTable do przechowywania różniących się rekordów.
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.
Zatwierdź zmiany z zestawu danych do bazy danych.
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
Sprawdzanie poprawności danych