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


Пошаговое руководство. Сохранение данных связанных таблиц данных (иерархическое обновление)

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

В данном пошаговом руководстве показано, как сохранить связанные данные с помощью компонента TableAdapterManager. Сведения о кодировании связанных таблиц данных вручную, см. в разделе Пошаговое руководство. Сохранение данных в базе данных (несколько таблиц).

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

Для выполнения этого пошагового руководтсва потребуется следующее:

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

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

Чтобы создать новое приложение Windows

  1. Из меню Файл создайте новый проект.

    Примечание

    Иерархическое обновление поддерживается в проектах Visual Basic и C#, создайте новый проект в одном из этих языков.

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

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

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

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

Поскольку требуются связанные таблицы для демонстрации иерархических обновлений, следующим шагом является создание набора данных, содержащего таблицы Customers и Orders из базы данных "Борей". Создайте набор данных с помощью Мастера настройки источников данных. Для создания подключения необходимо иметь доступ к демонстрационной базе данных Northwind. Сведения о настройке образца базы данных "Борей" содержатся в Практическое руководство. Установка образцов баз данных.

Для создания набора данных

  1. В меню Данные щелкните Показать источники данных.

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

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

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

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

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

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

  8. Установите флажки для таблиц Customers и Orders и нажмите кнопку Готово.

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

Изменение элемента управления с привязкой данных по умолчанию для его создания

После заполнения окна Источники данных можно выбрать элементы управления, создаваемые при перетаскивании элементов на форму Windows Forms. В этом пошаговом руководстве данные из таблицы Customers будут отображаться в отдельных элементах управления (Сведения). Данные из таблицы Orders будет отображаться в элементе управления DataGridView ( DataGridView).

Чтобы задать элемент управления для элементов в окне "Источники данных"

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

  2. Замените элемент управления таблицы Customers< на отдельные элементы управления, выбрав Сведения из раскрывающегося списка узла Customers. Дополнительные сведения см. в разделе Практическое руководство. Установка элемента управления, создаваемого при перетаскивании из окна "Источники данных".

    Примечание

    Таблица Orders будет использовать элемент управления по умолчанию, DataGridView.

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

После выбора элементов в окне Источники данных создайте элементы управления с привязкой к данным, перетаскивая их на форму.

Для создания элемента управления с привязкой к данным Customers и Orders

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

    Элементы управления с привязкой к данным с подписями отобразятся на форме вместе с компонентом TableAdapterManager, панелью инструментов (BindingNavigator) для управления записями. В области компонентов отобразятся типизированный DataSet, TableAdapter и BindingSource.

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

    Примечание

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

    Появится элемент управления DataGridView и панель инструментов (BindingNavigator) для перемещения по записям на форме. В области компонентов отображаются TableAdapter и BindingSource.

Изменение созданного сохраненного кода для выполнения иерархического обновления

Сохраните изменения связанных таблиц данных из набора данных в базу данных, вызвав метод TableAdapterManager.UpdateAll и передав имя набора данных, содержащего связанные таблицы. Например, вызовите метод TableAdapterManager.UpdateAll(NorthwindDataset) для отправки обновления из всех таблиц в NorthwindDataset в серверную базу данных.

После удаления элементов из окна Источники данных код автоматически добавляется к событию TableAdapter.Fill для заполнения каждой таблицы (методы Form_Load). Код также добавляется к событию нажатия кнопки Сохранить в BindingNavigator для сохранения данных из набора данных обратно в базу данных (метод TableAdapterManager.UpdateAll).

Сохраненный созданный код также содержит строку кода, которая вызывает метод CustomersBindingSource.EndEdit. Точнее он вызывает метод EndEdit первого BindingSource, добавленного в форму. Другими словами, этот код только создается для первой таблицы, которая была перетащена из окна Источники данных на форму. Вызов EndEdit сохраняет любые текущие изменения в любом элементе управления с привязкой к данным, который в этот момент редактируется. Таким образом, если элемент управления с привязкой к данным по-прежнему имеет фокус и вы нажмете кнопку Сохранить, все незафиксированные изменения фиксируются до фактического сохранения (метод TableAdapterManager.UpdateAll).

Примечание

Конструктор добавляет код BindingSource.EndEdit только для первой таблицы, перетащенной на форму.Таким образом, необходимо добавить строку кода для вызова метода BindingSource.EndEdit для каждой связанной таблицы на форме.В данном пошаговом руководстве это означает, что нужно добавить вызов метода OrdersBindingSource.EndEdit.

Чтобы обновить код так, чтобы применить изменения к связанным таблицам перед сохранением

  1. Дважды щелкните кнопку Сохранить в BindingNavigator, чтобы открыть Form1 в редакторе кода.

  2. Добавьте строку кода вызова метода OrdersBindingSource.EndEdit после строки, вызывающей метод CustomersBindingSource.EndEdit. Код для события нажатия кнопки Сохранить должен напоминать следующее:

    Me.Validate()
    Me.CustomersBindingSource.EndEdit()
    Me.OrdersBindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)
    
    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Кроме внесения изменений в связанную дочернюю таблицу перед сохранением данных в базу данных, может также потребоваться зафиксировать только что созданные родительские записи перед добавлением дочерних записей в набор данных. Другими словами, возможно потребуется добавление новой родительской записи (Customer) к набору данных перед ограничениями внешнего ключа новых дочерних записей (Orders), которые будут добавлены к набору данных. Чтобы выполнить это, можно использовать дочернее событие BindingSource.AddingNew.

Примечание

Фиксация новых родительских записей может быть необязательной; это зависит от типа элемента управления, который используется для привязки к источнику данных.В данном пошаговом руководстве используется отдельный элемент управления для привязки к родительской таблице; это требует дополнительного кода для того, чтобы зафиксировать новую родительскую запись.Если родительские записи отображались в сложном элементе управления, таком как DataGridView, этот дополнительный вызов EndEdit для родительской записи не будет необходимым.Это происходит потому, что основные функциональные возможности привязки данных элемента управления обрабатывают фиксацию новых записей.

Чтобы добавить код для фиксации родительской записи в наборе данных перед добавлением новых дочерних записей

  1. Создайте обработчик событий для события OrdersBindingSource.AddingNew.

    • Откройте Form1 в режиме конструктора, нажмите кнопку OrdersBindingSource в области компонентов, выберите События в окне Свойства и дважды щелкните событие AddingNew.
  2. Добавьте в обработчик событий строку кода, которая вызывает метод CustomersBindingSource.EndEdit. В обработчике событий OrdersBindingSource_AddingNew добавьте следующий код:

    Me.CustomersBindingSource.EndEdit()
    
    this.customersBindingSource.EndEdit();
    

Проверка использования иерархического обновления

Иерархические обновления включается и отключается установкой свойства Иерархическое обновление набора данных. Иерархические обновления включено по умолчанию, поэтому в данном пошаговом руководстве не требуется изменять значение свойства Иерархическое обновление.

Чтобы проверить, включено ли иерархическое обновление

  1. Откройте набор данных в окне Конструктор наборов данных, дважды щелкнув файл NorthwindDataSet.xsd в окне Обозреватель решений.

  2. Выберите свободную область на поверхности проектирования.

  3. Найдите свойство Иерархическое обновление в окно свойств и убедитесь, что оно имеет значение True.

    Примечание

    Свойство Иерархическое обновление определяет элемент управления, если код генерируется TableAdapterManager, и определяет логику выполнения иерархических обновлений.Присвоение параметру Иерархическое обновление значения True генерирует TableAdapterManager; присвоение параметру Иерархическое обновление значения False не генерирует TableAdapterManager.

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

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

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

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

  3. Добавьте нового клиента и добавьте новый заказ для клиента.

  4. Нажмите кнопку Сохранить. TableAdapterManager обрабатывает логику, необходимую для всех связанных обновлений.

  5. Проверьте значения в базе данных, чтобы убедиться, что изменения были сохранены в каждой таблицы.

Следующие действия

В зависимости от требований приложения существуют несколько шагов, выполнение которых может потребоваться после сохранения связанных данных в приложении Windows. Можно внести в приложение следующие усовершенствования:

  • Добавление третьей таблицы, например таблицы OrderDetails, и использование иерархии из трех таблиц.

  • Добавление кода проверки, чтобы проверить, что данные соответствуют требованиям приложения в дополнение к ограничениям базы данных. Дополнительные сведения см. в разделе Проверка данных.

См. также

Задачи

Практическое руководство. Настройка ограничений внешнего ключа в наборе данных

Практическое руководство. Установка порядка выполнения иерархического обновления

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

Практическое руководство. Реализация иерархического обновления в существующих проектах Visual Studio

Пошаговое руководство. Сохранение данных связанных таблиц данных (иерархическое обновление)

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

Иерархическое обновление

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

Объекты DataSet, DataTable и DataView (ADO.NET)