Поделиться через


Пошаговое руководство. Сохранение данных в транзакции

 

Опубликовано: Апрель 2016

В этом пошаговом руководстве демонстрируется сохранение данных в транзакции с помощью пространства имен System.Transactions. В данном примере используются таблицы Customers и Orders из учебной базы данных "Борей".

Обязательные компоненты

В данном пошаговом руководстве требуется доступ к учебной базе данных "Борей". Дополнительные сведения о настройке учебной базы данных "Борей" см. в разделе Практическое руководство. Установка образцов баз данных.

Создание приложения Windows

Первым шагом является создание Приложения Windows.

Порядок создания нового проекта Windows

  1. В меню Файл Visual Studio создайте новый Проект.

  2. Присвойте проекту имя "SavingDataInATransactionWalkthrough".

  3. Выберите Приложение Windows и нажмите кнопку ОК. Для получения дополнительной информации см. Клиентские приложения.

    Создается проект SavingDataInATransactionWalkthrough, который добавляется в Обозреватель решений.

Создание источника данных в виде базы данных

В этом шаге мастер настройки источника данных используется для создания источника данных на основе таблиц Customers и Orders в учебной базе данных "Борей".

Создание источника данных

  1. В меню Данные выберите команду Показать источники данных.

  2. В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.

  3. На странице Выбор типа источника данных выберите элемент База данных и нажмите Далее.

  4. На странице Выбор подключения к базе данных выполните одно из следующих действий.

    • Если подключение к учебной базе данных Northwind доступно в раскрывающемся списке, то выберите его.

      -или-

    • Выберите Новое подключение для открытия диалогового окна Добавить/изменить подключение и создайте новое подключение к базе данных "Борей".

  5. Если базе данных требуется пароль, выберите параметр для включения конфиденциальных данных и щелкните Далее.

  6. На странице Сохранение подключения в файле конфигурации приложения нажмите кнопку Далее.

  7. Разверните узел Таблицы на странице Выбор объектов базы данных.

  8. Выберите таблицы 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

  1. В меню Проект выберите пункт Добавить ссылку.

  2. Выберите System.Transactions (на вкладке .NET) и нажмите кнопку ОК.

    Ссылка на System.Transactions добавляется в проект.

Изменение кода в кнопке SaveItem объекта BindingNavigator

По умолчанию для первой перетащенной на форму таблицы в событие click кнопки сохранения в BindingNavigator добавляется код. Для обновления дополнительных таблиц вам необходимо добавить такой код вручную. В этом пошаговом руководстве мы выполнили рефакторинг имеющегося кода сохранения из обработчика события щелчка кнопки сохранения и создали несколько дополнительных методов для предоставления определенной функциональности обновления, основанной на потребности в добавлении или удалении строки.

Изменение автоматически сформированного кода сохранения

  1. Дважды нажмите кнопку Сохранить на CustomersBindingNavigator (кнопка со значком гибкого диска).

  2. Замените метод CustomersBindingNavigatorSaveItem_Click следующим кодом:

            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();
                }
            }
    
        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
    

При согласовании изменений связанных данных применяется следующий порядок.

  • Удалите дочерние записи (в данном случае удалите записи из таблицы Orders).

  • Удалите родительские записи (в данном случае удалите записи из таблицы Customers).

  • Вставьте родительские записи (в данном случае вставьте записи в таблицу Customers).

  • Вставьте дочерние записи (в данном случае вставьте записи в таблицу Orders).

Удаление существующих заказов

  • Добавьте следующий метод DeleteOrders в Form1:

            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");
                    }
                }
            }
    
        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
    

Удаление существующих клиентов

  • Добавьте следующий метод DeleteCustomers в Form1:

            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");
                    }
                }
            }
    
        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
    

Добавление новых клиентов

  • Добавьте следующий метод AddNewCustomers в Form1:

            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");
                    }
                }
            }
    
        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
    

Добавление новых заказов

  • Добавьте следующий метод AddNewOrders в Form1:

            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");
                    }
                }
            }
    
        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
    

Запуск приложения

Запуск приложения

  • Нажмите клавишу F5 для запуска приложения.

См. также

Транзакции и параллелизм
Распределенные транзакции Oracle
Практическое руководство. Сохранение данных с помощью транзакции
Интеграция System.Transactions с SQL Server
Подключение к данным в Visual Studio
Подготовка приложения к получению данных
Выборка данных в приложение
Привязка элементов управления к данным в Visual Studio
Редактирование данных в приложении
Проверка данных
Сохранение данных