Практическое руководство. Обновление данных с помощью адаптера таблицы
После того, как данные в наборе данных были изменены и проверены, возможно, потребуется отправить обновленные данные обратно в базу данных.Для отправки измененных данных в базу данных вызовите метод Update объекта TableAdapter.Метод Update адаптера обновит одну таблицу с данными и выполнит корректную команду (INSERT, UPDATE или DELETE) в зависимости от свойства RowState каждой строки данных в таблице.При сохранении данных в связанных таблицах Visual Studio предоставляет новый компонент TableAdapterManager, который помогает выполнять сохранение в правильном порядке в зависимости от ограничений внешнего ключа, определенных в базе данных.Дополнительные сведения см. в разделе Общие сведения об иерархическом обновлении.
Примечание |
---|
Так как попытка обновления источника данных содержимым набора данных может вызвать ошибки, следует вставлять код, который вызывает метод Update адаптера внутри блока try/catch. |
Сама процедура обновления источника данных может варьироваться в зависимости от поставленных задач, но в любом случае приложение должно включать следующие этапы.
Вызовите метод Update адаптера внутри блока try/catch.
При возникновении исключения найдите строку данных, которая его вызвала.Дополнительные сведения см. в разделе Практическое руководство. Поиск строк с ошибками.
Устраните ошибку в строке данных (по возможности программно, или путем предложения пользователю отредактировать ошибочную строку), затем повторите попытку обновления (HasErrors, GetErrors).
Сохранение данных в базе данных
Вызовите метод Update объекта TableAdapter, передав имя таблицы, которая содержит значения для записи в базу данных.
Чтобы обновить базу данных, которая содержит набор данных, с помощью TableAdapter
Заключите метод Update адаптера в блок try/catch.В следующем примере демонстрируется попытка обновления внутри блока try/catch содержимым таблицы Customers в 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"); }
Обновление двух связанных таблиц в наборе данных с помощью TableAdapter
При обновлении связанных таблиц в наборе данных необходимо обновлять их в правильной последовательности, чтобы уменьшить вероятность нарушения ограничений целостности данных.Порядок выполнения команды будет также зависеть от индексов DataRowCollection в наборе данных.Чтобы предотвратить возникновение ошибок, связанных с целостностью данных, рекомендуется обновлять базу данных в следующей последовательности:
Дочерняя таблица: удаление записей.
Родительская таблица: вставка, обновление и удаление записей.
Дочерняя таблица: вставка и обновление записей.
Примечание При обновлении двух или более связанных таблиц следует включить всю логику обновления в транзакцию.Транзакция — это процесс, гарантирующий, что все взаимосвязанные изменения в базе данных будут успешными вплоть до фиксации изменений.Дополнительные сведения см. в разделе Performing Transactions.
Для обновления двух связанных таблиц с помощью TableAdapter:
Создайте три временных таблицы данных для хранения различных записей.
Вызовите метод Update для каждого подмножества строк из блока try/catch.При возникновении ошибок обновления следует остановиться и устранить их.
Зафиксируйте изменения в базе данных.
Удалите временные таблицы данных для освобождения системных ресурсов.
Следующий пример показывает, как обновить источник данных с помощью набора данных, содержащего связанные таблицы.
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(); } } }
См. также
Основные понятия
Общие сведения об адаптере таблиц
Привязка элементов управления Windows Forms к данным в Visual Studio
Подготовка приложения к получению данных
Привязка элементов управления к данным в Visual Studio
Редактирование данных в приложении