Пошаговое руководство. Сохранение данных в транзакции
В этом пошаговом руководстве демонстрируется сохранение данных в транзакциях с использованием пространства имен System.Transactions.В этом пошаговом руководстве используются таблицы Customers и Orders из демонстрационной базы данных "Борей".
Обязательные компоненты
В данном пошаговом руководстве требуется доступ к образцу базы данных "Борей".Сведения о настройке учебной базы данных Northwind см. в разделе Практическое руководство. Установка образцов баз данных.
Создание приложения Windows
Первым шагом является создание Приложения Windows.
Чтобы создать новый проект Windows
В Visual Studio из меню Файл создайте новый Проект.
Назовите проект SavingDataInATransactionWalkthrough.
Выберите Приложение Windows и нажмите кнопку OK.Дополнительные сведения см. в разделе Разработка клиентских приложений.
Проект SavingDataInATransactionWalkthrough создан и добавлен в Обозреватель решений.
Создание источника данных базы данных
Этот шаг использует мастер настройки источника данных для создания источника данных, основанного на таблицах Customers и Orders образца базы данных "Борей".
Создание источника данных
В меню Данные выберите пункт Показать источники данных.
Чтобы запустить Мастер настройки источника данных, выберите элемент Добавить новый источник данных в окне Источники данных.
На странице Выбор типа источника данных выберите элемент База данных и нажмите Далее.
На странице Выбор подключения базы данных выполните одно из следующих действий:
Если подключение к учебной базе данных Northwind доступно в раскрывающемся списке, то выберите его.
-или-
Выберите Создать подключение, чтобы открыть диалоговое окно Добавить/изменить подключение, и создайте подключение к базе данных "Борей".Дополнительные сведения см. в разделе Диалоговое окно "Добавить/Изменить подключение" (вкладка "Общие").
Если базе данных требуется пароль, выберите параметр для включения конфиденциальных данных и щелкните Далее.
Щелкните Далее на странице Сохранение подключения в файле конфигурации приложения.
Разверните узел Таблицы на странице Выбор объектов базы данных.
Выберите таблицы Customers и Orders и нажмите кнопку Готово.
NorthwindDataSet добавляется к проекту, и таблицы Customers и Orders появляются в окне Источники данных.
Добавление элементов управления в форму
Можно создавать элементы управления с привязкой к данным, перетаскивая элементы из окна Источники данных на форму.
Для создания элементов управления с привязкой к данным в формах Windows Form
Разверните узел Customers в окне Источники данных.
Перетащите главный узел Customers из окна Источники данных на Form1.
На форме появится элемент управления DataGridView и панель инструментов (BindingNavigator) для перемещения по записям.NorthwindDataSet, CustomersTableAdapter, BindingSource и BindingNavigator появляются в области компонента.
Перетащите связанный узел Orders (связанный узел подчиненной таблицы под столбцом Fax, а не основной узел Orders) в форму под CustomersDataGridView.
В форме появится элемент DataGridView.OrdersTableAdapter и BindingSource отображаются в области компонентов.
Добавление ссылки на сборку System.Transactions
Транзакции используют пространство имен System.Transactions.Ссылка проекта на сборку System.Transactions не добавляется по умолчанию, поэтому необходимо добавить ее вручную.
Чтобы добавить ссылки на файл библиотеки DLL System.Transactions
В меню Проект выберите Добавить ссылку.
Выберите System.Transactions (на вкладке .NET) и нажмите кнопку OK.
Ссылка на 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 для запуска приложения.
См. также
Задачи
Практическое руководство. Сохранение данных с помощью транзакции
Основные понятия
Enlisting in Distributed Transactions
Leveraging System.Transactions
Подготовка приложения к получению данных
Привязка элементов управления к данным в Visual Studio
Редактирование данных в приложении