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


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

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

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

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

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

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

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

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

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

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

    Создается проект 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 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

Редактирование данных в приложении

Проверка данных

Сохранение данных

Другие ресурсы

Транзакции и параллелизм

Подключение к данным в Visual Studio