Практическое руководство. Обновление данных с помощью адаптера таблицы
Опубликовано: Апрель 2016
После того, как данные в наборе данных были изменены и проверены, возможно, потребуется отправить обновленные данные обратно в базу данных. Для отправки измененных данных в базу данных вызовите метод 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 { this.Validate(); this.customersBindingSource.EndEdit(); this.customersTableAdapter.Update(this.northwindDataSet.Customers); MessageBox.Show("Update successful"); } catch (System.Exception ex) { MessageBox.Show("Update failed"); }
Try Me.Validate() Me.CustomersBindingSource.EndEdit() Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers) MsgBox("Update successful") Catch ex As Exception MsgBox("Update failed") End Try
Обновление двух связанных таблиц в наборе данных с помощью TableAdapter
При обновлении связанных таблиц в наборе данных необходимо обновлять их в правильной последовательности, чтобы уменьшить вероятность нарушения ограничений целостности данных. Порядок выполнения команды будет также зависеть от индексов DataRowCollection в наборе данных. Чтобы предотвратить возникновение ошибок, связанных с целостностью данных, рекомендуется обновлять базу данных в следующей последовательности:
Дочерняя таблица: удаление записей.
Родительская таблица: вставка, обновление и удаление записей.
Дочерняя таблица: вставка и обновление записей.
Примечание
При обновлении двух или более связанных таблиц следует включить всю логику обновления в транзакцию. Транзакция — это процесс, гарантирующий, что все взаимосвязанные изменения в базе данных будут успешными вплоть до фиксации изменений. Дополнительные сведения см. в разделе Транзакции и параллелизм.
Для обновления двух связанных таблиц с помощью TableAdapter:
Создайте три временных таблицы данных для хранения различных записей.
Вызовите метод
Update
для каждого подмножества строк из блокаtry
/catch
. При возникновении ошибок обновления следует остановиться и устранить их.Зафиксируйте изменения в базе данных.
Удалите временные таблицы данных для освобождения системных ресурсов.
Следующий пример показывает, как обновить источник данных с помощью набора данных, содержащего связанные таблицы.
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(); } } }
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
См. также
Общие сведения об адаптере таблиц
Пошаговые руководства работы с данными
Привязка элементов управления Windows Forms к данным в Visual Studio
Подключение к данным в Visual Studio
Подготовка приложения к получению данных
Выборка данных в приложение
Привязка элементов управления к данным в Visual Studio
Редактирование данных в приложении
Проверка данных
Сохранение данных