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


Сохранение данных в базе данных (несколько таблиц) в приложениях .NET Framework

Замечание

Классы DataSet и связанные классы являются устаревшими технологиями .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти, пока приложения отключены от базы данных. Технологии особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных являются проверенными успешными технологиями, рекомендуемый подход для новых приложений .NET заключается в использовании Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей и имеет более простой интерфейс программирования.

Одним из наиболее распространенных сценариев разработки приложений является отображение данных в форме в приложении Windows, редактирование данных и отправка обновленных данных обратно в базу данных. В этом пошаговом руководстве создается форма, которая отображает данные из двух связанных таблиц и показывает, как редактировать записи и сохранять изменения обратно в базу данных. В этом примере используются таблицы Customers и Orders из образца базы данных Northwind.

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

Задачи, показанные в этом пошаговом руководстве, включают:

Предпосылки

Чтобы пройти это руководство, вам потребуются рабочие компоненты для разработки приложений для настольных ПК на .NET и хранения и обработки данных, установленные в Visual Studio. Чтобы установить их, откройте Установщик Visual Studio и выберите Изменить (или Дополнительно>Изменить) рядом с версией Visual Studio, которую вы хотите изменить. См. изменения в Visual Studio.

В этом пошаговом руководстве используется SQL Server Express LocalDB и пример базы данных Northwind.

  1. Если у вас нет SQL Server Express LocalDB, установите его на странице скачивания SQL Server Express или с помощью Установщика Visual Studio. В установщике Visual Studioможно установить SQL Server Express LocalDB в рамках рабочей нагрузки хранилища данных и обработки или как отдельный компонент.

  2. Установите пример базы данных Northwind, выполнив следующие действия.

    1. В Visual Studio откройте окно обозревателя объектов SQL Server. (Обозреватель объектов SQL Server устанавливается как часть рабочей нагрузки хранилища данных и обработки в Visual Studio Installer.) Разверните узел SQL Server. Щелкните правой кнопкой мыши экземпляр LocalDB и выберите Новый запрос.

      Откроется окно редактора запросов.

    2. Скопируйте скрипт Northwind Transact-SQL в буфер обмена. Этот скрипт T-SQL создает базу данных Northwind с нуля и заполняет ее данными.

    3. Вставьте скрипт T-SQL в редактор запросов, а затем нажмите кнопку Выполнить.

      Через некоторое время запрос завершает работу и создается база данных Northwind.

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

Создайте проект приложения Windows Forms для C# или Visual Basic. Присвойте проекту имя UpdateMultipleTablesWalkthrough.

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

На этом шаге создается источник данных из базы данных Northwind с помощью мастера настройки источника данных. Для создания подключения необходимо иметь доступ к образцу базы данных Northwind. Сведения о настройке примера базы данных Northwind см. в разделе Практическое руководство: Установка примеров баз данных.

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

    Откроется окно "Источники данных ".

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

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

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

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

      -или-

    • Выберите "Создать подключение", чтобы открыть диалоговое окно "Добавление и изменение подключения ".

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

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

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

  8. Выберите таблицы "Клиенты и заказы ", а затем нажмите кнопку "Готово".

    NorthwindDataSet добавляется в проект, а таблицы отображаются в окне источников данных.

Задать параметры создаваемых элементов управления

В этом пошаговом руководстве данные в Customers таблице представлены в формате сведений, где данные отображаются в отдельных элементах управления. Данные из Orders таблицы отображаются в виде сетки, которая представлена в элементе DataGridView управления.

Установка типа удаления элементов в окне "Источники данных"

  1. В окне "Источники данных" разверните узел "Клиенты ".

  2. На узле "Клиенты" выберите "Сведения" из списка элементов управления, чтобы изменить элемент управления таблицей "Клиенты " на отдельные элементы управления. Дополнительные сведения см. в разделе "Настройка элемента управления для создания при перетаскивании из окна источников данных".

Создание формы, привязанной к данным

Элементы управления с привязкой к данным можно создать, перетащив элементы из окна источников данных в форму.

  1. Перетащите основной узел Customers из окна источников данных в Form1.

    Элементы управления с привязкой к данным с описательными метками отображаются в форме вместе с полосой инструментов (BindingNavigator) для навигации по записям. Объект NorthwindDataSet, CustomersTableAdapter, BindingSource, и BindingNavigator отображаются в области компонентов.

  2. Перетащите связанный узел Orders из окна источников данных в Form1.

    Замечание

    Связанный узел Orders находится под столбцом Факса и является дочерним узлом узла Customers .

    Элемент управления DataGridView и полоса инструментов BindingNavigator для навигации по записям находятся на форме. OrdersTableAdapter и BindingSource отображаются в области компонентов.

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

Вы можете обновить базу данных, вызвав Update методы Клиенты и Заказы TableAdapters. По умолчанию обработчик событий для кнопкиBindingNavigator"Сохранить" в код формы добавляется для отправки обновлений в базу данных. Эта процедура изменяет код для отправки обновлений в правильном порядке. Это устраняет возможность возникновения ошибок целостности ссылок. Код также реализует обработку ошибок путем упаковки вызова обновления в блок try-catch. Вы можете изменить код в соответствии с потребностями приложения.

Замечание

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

Добавление логики обновления в приложение

  1. Нажмите кнопку "Сохранить " на вкладке BindingNavigator. Откроется редактор кода для обработки события bindingNavigatorSaveItem_Click.

  2. Замените код в обработчике событий, чтобы вызывать методы Update у соответствующих TableAdapters. Следующий код сначала создает три временные таблицы данных для хранения обновленных данных для каждого DataRowState (Deleted, Added, и Modified). Обновления выполняются в правильном порядке. Код должен выглядеть следующим образом:

    this.Validate();
    this.ordersBindingSource.EndEdit();
    this.customersBindingSource.EndEdit();
    
    NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
    NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
    NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
    try
    {
        // Remove all deleted orders from the Orders table.
        if (deletedOrders != null)
        {
            ordersTableAdapter.Update(deletedOrders);
        }
    
        // Update the Customers table.
        customersTableAdapter.Update(northwindDataSet.Customers);
    
        // Add new orders to the Orders table.
        if (newOrders != null)
        {
            ordersTableAdapter.Update(newOrders);
        }
    
        // Update all modified Orders.
        if (modifiedOrders != null)
        {
            ordersTableAdapter.Update(modifiedOrders);
        }
    
        northwindDataSet.AcceptChanges();
    }
    
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    
    finally
    {
        if (deletedOrders != null)
        {
            deletedOrders.Dispose();
        }
        if (newOrders != null)
        {
            newOrders.Dispose();
        }
        if (modifiedOrders != null)
        {
            modifiedOrders.Dispose();
        }
    }
    

Тестирование приложения

  1. Нажмите клавишу F5.

  2. Внесите некоторые изменения в данные одной или нескольких записей в каждой таблице.

  3. Выберите кнопку Сохранить.

  4. Проверьте значения в базе данных, чтобы убедиться, что изменения сохранены.