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

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

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

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

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

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

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

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

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

    Примечание

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

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

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

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

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

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

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

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

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

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

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

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

      -или-

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

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

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

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

  8. Установите флажки для таблиц Клиенты и Заказы, а затем нажмите кнопку Готово.

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

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

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

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

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

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

    Примечание

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

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

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

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

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

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

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

    Примечание

    Связанный узел Заказы расположен под узлом Факс таблицы клиентов и является дочерним для узла Клиенты.Узел Заказы, являющийся одноранговым для узла Клиенты, представляет все заказы в таблице.Узел Заказы, являющийся дочерним для узла Клиенты, представляет связанные заказы.

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

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

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

После удаления элементов из окна Источники данных в событие Form_Load автоматически добавляется код для заполнения каждой таблицы (методы TableAdapter.Fill). Код также добавляется в событие нажатия кнопки Сохранить объекта 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);
    

Кроме фиксации изменений в связанной дочерней таблице перед сохранением данных в базе данных, вам также может понадобиться фиксировать недавно созданные родительские записи перед добавлением новых дочерних записей в базу данных. Другими словами, вам может понадобиться добавить новую родительскую запись (клиент) в базу данных, прежде чем ограничение внешнего ключа позволит добавить в набор данных дочерние записи (заказы). Для этого можно использовать дочернее событие 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 и логика выполнения иерархических обновлений.При установке для HierarchicalUpdate значения True создается TableAdapterManager; при установке для HierarchicalUpdate значения False TableAdapterManager не создается.

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

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

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

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

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

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

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

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

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

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

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

См. также

Задачи

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

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

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

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

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

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

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

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

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

Объекты DataSet, DataTable и DataView