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

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

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

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

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

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

Чтобы создать новый проект Windows

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

  2. Назовите проект SavingDataInATransactionWalkthrough.

  3. Выберите Приложение Windows и нажмите кнопку OK.Дополнительные сведения см. в разделе Разработка клиентских приложений.

    Проект SavingDataInATransactionWalkthrough создан и добавлен в Обозреватель решений.

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

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

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

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

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

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

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

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

      -или-

    • Выберите Создать подключение, чтобы открыть диалоговое окно Добавить/изменить подключение, и создайте подключение к базе данных "Борей".Дополнительные сведения см. в разделе Диалоговое окно "Добавить/Изменить подключение" (вкладка "Общие").

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

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

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

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

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

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

    Ссылка на 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 для запуска приложения.

См. также

Задачи

Практическое руководство. Сохранение данных с помощью транзакции

Основные понятия

Enlisting in Distributed Transactions

Leveraging System.Transactions

Подготовка приложения к получению данных

Выборка данных в приложение

Привязка элементов управления к данным в Visual Studio

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

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

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

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

Performing Transactions

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