Пошаговое руководство. Сохранение данных в транзакции
В этом пошаговом руководстве демонстрируется сохранение данных в транзакции с помощью пространства имен System.Transactions. В данном примере используются таблицы Customers и Orders из учебной базы данных "Борей".
Обязательные компоненты
В данном пошаговом руководстве требуется доступ к учебной базе данных "Борей". Дополнительные сведения о настройке учебной базы данных "Борей" см. в разделе Практическое руководство. Установка образцов баз данных.
Создание приложения Windows
Первым шагом является создание Приложения Windows.
Порядок создания нового проекта Windows
В меню Файл Visual Studio создайте новый Проект.
Присвойте проекту имя "SavingDataInATransactionWalkthrough".
Выберите Приложение Windows и нажмите кнопку ОК. Для получения дополнительной информации см. Разработка клиентских приложений с использованием .NET Framework.
Создается проект SavingDataInATransactionWalkthrough, который добавляется в Обозреватель решений.
Создание источника данных в виде базы данных
В этом шаге мастер настройки источника данных используется для создания источника данных на основе таблиц Customers и Orders в учебной базе данных "Борей".
Создание источника данных
В меню Данные выберите команду Показать источники данных.
В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.
На странице Выбор типа источника данных выберите элемент База данных и нажмите Далее.
На странице Выбор подключения к базе данных выполните одно из следующих действий.
Если подключение к учебной базе данных Northwind доступно в раскрывающемся списке, то выберите его.
-или-
Выберите Новое подключение для открытия диалогового окна Добавить/изменить подключение и создайте новое подключение к базе данных "Борей".
Если базе данных требуется пароль, выберите параметр для включения конфиденциальных данных и щелкните Далее.
На странице Сохранение подключения в файле конфигурации приложения нажмите кнопку Далее.
Разверните узел Таблицы на странице Выбор объектов базы данных.
Выберите таблицы Customers и Orders и нажмите кнопку Готово.
Объект NorthwindDataSet добавляется в проект, и таблицы Customers и Orders отображаются в окне Источники данных.
Добавление элементов управления на форму
Вы можете создавать элементы управления с привязкой к данным с помощью перетаскивания элементов из окна Источники данных на форму.
Создание элементов управления с привязкой к данным на форме Windows Forms
Разверните узел Клиенты в окне Источники данных.
Перетащите главный узел Клиенты из окна Источники данных на Form1.
На форме появляется элемент DataGridView и панель инструментов (BindingNavigator) для перемещения по записям. В области компонентов появляется NorthwindDataSet, CustomersTableAdapter, BindingSource и BindingNavigator.
Перетащите связанный узел Заказы (связанный узел дочерней таблицы под столбцом Факс, а не главный узел Заказы) на форму под CustomersDataGridView.
На форме появляется DataGridView. В области компонентов отображается OrdersTableAdapter и BindingSource.
Добавление ссылки на сборку System.Transactions
Транзакции используют пространство имен System.Transactions. Ссылка проекта на сборку system.transactions не добавляется по умолчанию, поэтому вам нужно добавить ее вручную.
Порядок добавления ссылки на DLL-файл System.Transactions
В меню Проект выберите пункт Добавить ссылку.
Выберите System.Transactions (на вкладке .NET) и нажмите кнопку ОК.
Ссылка на System.Transactions добавляется в проект.
Изменение кода в кнопке SaveItem объекта BindingNavigator
По умолчанию для первой перетащенной на форму таблицы в событие click кнопки сохранения в BindingNavigator добавляется код. Для обновления дополнительных таблиц вам необходимо добавить такой код вручную. В этом пошаговом руководстве мы выполнили рефакторинг имеющегося кода сохранения из обработчика события щелчка кнопки сохранения и создали несколько дополнительных методов для предоставления определенной функциональности обновления, основанной на потребности в добавлении или удалении строки.
Изменение автоматически сформированного кода сохранения
Дважды нажмите кнопку Сохранить на CustomersBindingNavigator (кнопка со значком гибкого диска).
Замените метод CustomersBindingNavigatorSaveItem_Click следующим кодом:
Private Sub CustomersBindingNavigatorSaveItem_Click() Handles CustomersBindingNavigatorSaveItem.Click UpdateData() End Sub Private Sub UpdateData() Me.Validate() Me.CustomersBindingSource.EndEdit() Me.OrdersBindingSource.EndEdit() Using updateTransaction As New Transactions.TransactionScope DeleteOrders() DeleteCustomers() AddNewCustomers() AddNewOrders() updateTransaction.Complete() NorthwindDataSet.AcceptChanges() End Using End Sub
private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e) { UpdateData(); } private void UpdateData() { this.Validate(); this.customersBindingSource.EndEdit(); this.ordersBindingSource.EndEdit(); using (System.Transactions.TransactionScope updateTransaction = new System.Transactions.TransactionScope()) { DeleteOrders(); DeleteCustomers(); AddNewCustomers(); AddNewOrders(); updateTransaction.Complete(); northwindDataSet.AcceptChanges(); } }
При согласовании изменений связанных данных применяется следующий порядок.
Удалите дочерние записи (в данном случае удалите записи из таблицы Orders).
Удалите родительские записи (в данном случае удалите записи из таблицы Customers).
Вставьте родительские записи (в данном случае вставьте записи в таблицу Customers).
Вставьте дочерние записи (в данном случае вставьте записи в таблицу Orders).
Удаление существующих заказов
Добавьте следующий метод DeleteOrders в Form1:
Private Sub DeleteOrders() Dim deletedOrders As NorthwindDataSet.OrdersDataTable deletedOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) If Not IsNothing(deletedOrders) Then Try OrdersTableAdapter.Update(deletedOrders) Catch ex As Exception MessageBox.Show("DeleteOrders Failed") End Try End If End Sub
private void DeleteOrders() { NorthwindDataSet.OrdersDataTable deletedOrders; deletedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Deleted); if (deletedOrders != null) { try { ordersTableAdapter.Update(deletedOrders); } catch (System.Exception ex) { MessageBox.Show("DeleteOrders Failed"); } } }
Удаление существующих клиентов
Добавьте следующий метод DeleteCustomers в Form1:
Private Sub DeleteCustomers() Dim deletedCustomers As NorthwindDataSet.CustomersDataTable deletedCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.CustomersDataTable) If Not IsNothing(deletedCustomers) Then Try CustomersTableAdapter.Update(deletedCustomers) Catch ex As Exception MessageBox.Show("DeleteCustomers Failed" & vbCrLf & ex.Message) End Try End If End Sub
private void DeleteCustomers() { NorthwindDataSet.CustomersDataTable deletedCustomers; deletedCustomers = (NorthwindDataSet.CustomersDataTable) northwindDataSet.Customers.GetChanges(DataRowState.Deleted); if (deletedCustomers != null) { try { customersTableAdapter.Update(deletedCustomers); } catch (System.Exception ex) { MessageBox.Show("DeleteCustomers Failed"); } } }
Добавление новых клиентов
Добавьте следующий метод AddNewCustomers в Form1:
Private Sub AddNewCustomers() Dim newCustomers As NorthwindDataSet.CustomersDataTable newCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Added), NorthwindDataSet.CustomersDataTable) If Not IsNothing(newCustomers) Then Try CustomersTableAdapter.Update(newCustomers) Catch ex As Exception MessageBox.Show("AddNewCustomers Failed" & vbCrLf & ex.Message) End Try End If End Sub
private void AddNewCustomers() { NorthwindDataSet.CustomersDataTable newCustomers; newCustomers = (NorthwindDataSet.CustomersDataTable) northwindDataSet.Customers.GetChanges(DataRowState.Added); if (newCustomers != null) { try { customersTableAdapter.Update(newCustomers); } catch (System.Exception ex) { MessageBox.Show("AddNewCustomers Failed"); } } }
Добавление новых заказов
Добавьте следующий метод AddNewOrders в Form1:
Private Sub AddNewOrders() Dim newOrders As NorthwindDataSet.OrdersDataTable newOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) If Not IsNothing(newOrders) Then Try OrdersTableAdapter.Update(newOrders) Catch ex As Exception MessageBox.Show("AddNewOrders Failed" & vbCrLf & ex.Message) End Try End If End Sub
private void AddNewOrders() { NorthwindDataSet.OrdersDataTable newOrders; newOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Added); if (newOrders != null) { try { ordersTableAdapter.Update(newOrders); } catch (System.Exception ex) { MessageBox.Show("AddNewOrders Failed"); } } }
Запуск приложения
Запуск приложения
- Нажмите клавишу F5 для запуска приложения.
См. также
Задачи
Практическое руководство. Сохранение данных с помощью транзакции
Основные понятия
Распределенные транзакции Oracle
Интеграция System.Transactions с SQL Server
Подготовка приложения к получению данных
Привязка элементов управления к данным в Visual Studio
Редактирование данных в приложении