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:
Wykonanie kodu, która prób wysyłania aktualizacji do bazy danych w try/catch bloku.
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.
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:
Tabeli podrzędnej: usuwanie rekordów.
Tabela nadrzędna: wstawiania, aktualizacji i usuwania rekordów.
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
Utwórz tymczasowe trzy DataTables do przechowywania różnych rekordów.
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ć.
Zatwierdź zmiany z zestawu danych do bazy danych.
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
Sprawdzanie poprawności danych