- •Содержание
- •Введение
- •Цель лабораторной работы
- •Задачи лабораторной работы
- •Задание
- •Методика выполнения задания
- •Этап 1. Анализ требований к приложению и проектирование интерфейса
- •Информационная модель базы данных
- •Этап 2. Создание проекта
- •Этап 3. Подключение к базе данных
- •Выбор объектов базы данных
- •Структура главного меню
- •Этап 4. Создание представлений данных
- •Свойства TableAdapter
- •Этап 5. Создание запросов с параметрами
- •Ввод sql запроса
- •Этап 6. Отображение таблиц в приложении
- •Способ 1
- •Выбор источника данных
- •Способ 2
- •Панель инструментов BindingNavigator
- •Этап 7. Взаимодействие двух связанных таблиц в приложении
- •Этап 8. Связывание полей таблицы с элементами управления
- •Компонент NumericUpDown
- •Компонент DateTimePicker
- •Компонент ComboBox
- •Этап 9. Поиск (фильтрация данных)
- •Этап 10. Проверка введённых данных. Обработка ошибок
- •Этап 11. Создание форм справочников
- •Справочник клиентов Этап 12. Создание отчётов
- •Редактирование выражения для поля Text Box
- •Связь компонента ReportViewer с отчётом.
- •Форма с отчётом
- •Критерии результативности выполнения лабораторной работы
- •Контрольные вопросы
- •Список литературы
Этап 5. Создание запросов с параметрами
Согласно используемой информационной модели, один заказ может включать несколько покупок. Покупки хранятся в таблице «Purchases», в которой первичный ключ состоит из номера заказа и номера накладной, по которой продан товар.
Создадим запрос с параметром для выборки данных о покупках, совершённых в конкретном заказе.
Для этого следует:
найти в схеме данных нужную таблицу (в нашем случае «Purchases»);
щёлкнуть правой кнопкой мыши по соответствующему таблице классу TableAdapter (в нашем случае purchasesTableAdapter) и выбрать пункт контекстного меню «Add Query…» (Добавить запрос);
в появившемся окне мастера выбрать пункт «Use SQL Statements» и нажать кнопку «Next»;
в окне выбора типа запроса выбрать пункт «SELECT which returns rows» (SELECT, который возвращает строки) и нажать кнопку «Next»;
в окне ввода запроса ввести запрос с параметром в текстовое поле (рис. 18). Перед параметром, который будет передаваться в запрос, ставится знак «@». Нажать кнопку «Next»;
Ввод sql запроса
в окне выбора программных методов для выполнения запроса и заполнения таблицы выбрать оба метода и дать им названия (в нашем случае назовём их «FillByOrder» и «GetDataByOrder»). Нажать кнопку «Finish».
Схема данных будет обновлена с учётом добавленного запроса: таблица «Purchases» теперь имеет два запроса на выборку данных − без параметра и с параметром @order (номер заказа) (рис. 19).
Схема таблицы purchases с параметрическим запросом
Этап 6. Отображение таблиц в приложении
Для отображения таблиц в интерфейсе приложения можно использовать визуальный элемент управления «DataGridView». Для того чтобы им воспользоваться, можно воспользоваться следующими способами.
Способ 1
открыть форму в режиме дизайна;
открыть плавающее окно Toolbox;
найти компонент «DataGridView» и перетащить на форму;
повторить шаги 2 и 3 для всех таблиц, которые планируется разместить на форме (в нашем случае 2 таблицы);
выделить на форме компонент «DataGridView»;
открыть плавающее окно «Properties» (Свойства);
в свойстве «DataSource» (Источник данных) выбрать таблицу или представление из источника данных, которое требуется отобразить в визуальном компоненте (в нашем случае это «ordersWfio» для первой таблицы и «purchases» для второй). При этом автоматически будут созданы соответствующие объекты «BindingSource» и «TableAdapter» (рис. 20);
Выбор источника данных
повторить шаги 5-7 для всех требуемых таблиц.
Способ 2
открыть всплывающее окно Data Sources;
найти требуемую таблицу или представление;
перетащить таблицу или представление на форму. В результате этого на форме появится компонент DataGridView со всеми заполненными свойствами, а также панель инструментов BindingNavigator (рис. 21), которая содержит элементы управления для навигации по таблице и вставки/удаления/обновления записей.
Панель инструментов BindingNavigator
повторить пункты 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().
