Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка клиент-серверного приложения.ЛР 5 -...docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
982 Кб
Скачать
☆

Этап 5. Создание запросов с параметрами

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

Создадим запрос с параметром для выборки данных о покупках, совершённых в конкретном заказе.

Для этого следует:

  1. найти в схеме данных нужную таблицу (в нашем случае «Purchases»);

  2. щёлкнуть правой кнопкой мыши по соответствующему таблице классу TableAdapter (в нашем случае purchasesTableAdapter) и выбрать пункт контекстного меню «Add Query…» (Добавить запрос);

  3. в появившемся окне мастера выбрать пункт «Use SQL Statements» и нажать кнопку «Next»;

  4. в окне выбора типа запроса выбрать пункт «SELECT which returns rows» (SELECT, который возвращает строки) и нажать кнопку «Next»;

  5. в окне ввода запроса ввести запрос с параметром в текстовое поле (рис. 18). Перед параметром, который будет передаваться в запрос, ставится знак «@». Нажать кнопку «Next»;

  1. Ввод sql запроса

  1. в окне выбора программных методов для выполнения запроса и заполнения таблицы выбрать оба метода и дать им названия (в нашем случае назовём их «FillByOrder» и «GetDataByOrder»). Нажать кнопку «Finish».

Схема данных будет обновлена с учётом добавленного запроса: таблица «Purchases» теперь имеет два запроса на выборку данных − без параметра и с параметром @order (номер заказа) (рис. 19).

  1. Схема таблицы purchases с параметрическим запросом

Этап 6. Отображение таблиц в приложении

Для отображения таблиц в интерфейсе приложения можно использовать визуальный элемент управления «DataGridView». Для того чтобы им воспользоваться, можно воспользоваться следующими способами.

Способ 1

  1. открыть форму в режиме дизайна;

  2. открыть плавающее окно Toolbox;

  3. найти компонент «DataGridView» и перетащить на форму;

  4. повторить шаги 2 и 3 для всех таблиц, которые планируется разместить на форме (в нашем случае 2 таблицы);

  5. выделить на форме компонент «DataGridView»;

  6. открыть плавающее окно «Properties» (Свойства);

  7. в свойстве «DataSource» (Источник данных) выбрать таблицу или представление из источника данных, которое требуется отобразить в визуальном компоненте (в нашем случае это «ordersWfio» для первой таблицы и «purchases» для второй). При этом автоматически будут созданы соответствующие объекты «BindingSource» и «TableAdapter» (рис. 20);

  1. Выбор источника данных

  1. повторить шаги 5-7 для всех требуемых таблиц.

Способ 2

  1. открыть всплывающее окно Data Sources;

  2. найти требуемую таблицу или представление;

  3. перетащить таблицу или представление на форму. В результате этого на форме появится компонент DataGridView со всеми заполненными свойствами, а также панель инструментов BindingNavigator (рис. 21), которая содержит элементы управления для навигации по таблице и вставки/удаления/обновления записей.

  1. Панель инструментов BindingNavigator

  1. повторить пункты 2-3 для всех требуемых таблиц.

Этап 7. Взаимодействие двух связанных таблиц в приложении

Для нашего приложения требуется, чтобы для каждого заказа отображались только совершенные в его рамках покупки. То есть при смене позиции текущей записи в первой таблице для второй таблицы вызывается запрос на выборку с параметром, где параметр − первичный ключ первой таблицы (номер заказа).

Необходимой операцией является получение значения первичного ключа текущей записи первой таблицы. Откроем код формы и напишем следующий код:

private int getCurrentOrder()

{

int ord = 0;

if (this.ordersWfioBindingSource.Count > 0)

{

DataRowView curOrd = (DataRowView)ordersWfioBindingSource.Current;

ord = Convert.ToInt32(curOrd["id_order"]);

}

return ord;

}

Эта функция возвращает текущее значение поля id_order в том случае, если таблица не пуста, и 0 в противном случае.

Сделаем так, чтобы при изменении текущей позиции в первой таблице вызывался ранее созданный запрос с параметром. Для этого в дизайнере форм выделим первую таблицу и в окне «Properties» перейдём на вкладку событий (пиктограмма ). Найдём событие «SelectionChanged» и дважды щёлкнем по нему, чтобы перейти к написанию кода обработчика события. Напишем следующий код:

this.purchasesTableAdapter.FillByOrder(this.shopDataSet.purchases, this.getCurrentOrder());

Теперь при смене текущей записи в таблице заказов таблица покупок будет заполняться соответствующими данными.

При использовании визуальных элементов для отображения данных в обработчик события «FormLoad» автоматически заносится код для заполнения всех используемых таблиц (метод Fill() класса TableAdapter). Это значит, что при запуске программы вторая таблица будет заполнена всеми данными, которые содержатся в таблице «Purchases». Чтобы этого не происходило, найдём вызов метода this.purchasesTableAdapter.Fill() в обработчике события FormLoad и заменим его на приведённый выше this.purchasesTableAdapter.FillByOrder(). Обратите внимание, что вызов запроса с параметром должен происходить после того, как первая таблица заполнена соответствующим ей методом Fill().