Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовые работы / Разработка приложения на ЯВУ для доступа к базе данных

.pdf
Скачиваний:
68
Добавлен:
28.06.2014
Размер:
1.09 Mб
Скачать

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

Кроме того, текст запроса можно как сохранить в файл, так и открыть из файла (за это отвечают соответствующие пункты меню).

Приведем код обработчика события нажатия на клавишу:

21

private void button1_Click(object sender, EventArgs e) { string query = QueryText.Text;

try {

using (SqlConnection c = new SqlConnection(Properties.Settings.Default.aptekaConnectionString)) {

c.Open();

using (SqlDataAdapter ad = new SqlDataAdapter(query, c)) { DataTable t = new DataTable();

ad.Fill(t); QueryResultView.DataSource = t;

}

}

}

catch (Exception s) { MessageBox.Show(s.Message); }

}

Создается и открывается подключение к базе данных, создается требуемый для команды адаптер. После этого адаптер заполняет данными объект класса DataTable, который затем назначается источником данных для таблицы на форме. В случае некорректной работы построенного запроса возбуждается исключение типа SqlException, которое успешно отлавливается последующей инструкцией catch.

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

22

При нажатии на кнопку в случае необходимости появляется диалоговое окно с приглашением ввести требуемый параметр:

При нажатии на кнопку «OK» программа создает запрос с необходимым параметром и пробует его выполнить. Пример успешного результата:

Приведем код обработчика события нажатия на одну из кнопок:

private void button1_Click(object sender, EventArgs e)

{

dialogbox dialogBox = new dialogbox("Способ применения"); DialogResult dr = new DialogResult();

dr = dialogBox.ShowDialog(); if (dr == DialogResult.OK)

{

string way = dialogBox.ReturnedString;

string query = "SELECT Name as 'Название', Dose as 'Дозировка' FROM Medicine WHERE WayOfUse='" + way + "'";

PerformQuery(query);

}

23

}

Функция PerformQuery(string query) построена абсолютно аналогично обработчику события нажатия на кнопку на форме для выполнения произвольных запросов к БД.

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

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

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

Приведем текст функции, выполняющей обращение к хранимой процедуре на сервере:

24

private string ExecReport(string reporttype) { using (SqlConnection connection =

new SqlConnection(Properties.Settings.Default.aptekaConnectionString)) {

connection.Open();

SqlCommand a = new SqlCommand(reporttype, connection); a.CommandType = CommandType.StoredProcedure;

SqlParameter parameter = a.Parameters.Add( "@out", SqlDbType.Int);

parameter.Direction = ParameterDirection.ReturnValue;

parameter = a.Parameters.Add( "@output", SqlDbType.VarChar, 8000);

parameter.Direction = ParameterDirection.Output;

a.ExecuteNonQuery();

return Convert.ToString(a.Parameters["@output"].Value);

}

}

При выполнении данной части кода открывается подключение,

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

Текст одной из процедур приведен в приложении 2.

Создание триггеров для обеспечения целостности данных

Внешние ключи

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

25

Выбранный параметр No Action в поле Delete Rule означает, что в случае удаления записи о складе будет проверена таблица «Поставщик» на предмет наличия связанных записей и удаление будет произведено только в случае отсутствия таковых. Для Update Rule выбрано каскадное обновление данных, то есть при внесении изменений в таблице «Склад», затрагивающих идентификационный номер склада, аналогичные изменения будут внесены в таблицу «Поставщик». Другими опциями являются Set Null и Set Default. При выборе первой в поле, соответствующее внешнему ключу, устанавливается значение NULL, при выборе второй – значение по умолчанию.

Именно такой метод поддержания ссылочной целостности для внешних ключей рекомендуют официальные источники1.

Прочие триггеры

Было решено использовать триггеры для правил, связанных с датами.

Так, очевидно, мы не можем получать новые поставки от поставщика, с

которым уже расторгнут договор, не можем уволить сотрудника раньше его принятия на работу, принять сотрудника на работу позже, чем текущая дата.

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

1 http://support.microsoft.com/kb/142480

26

Таблица Склад

o Дата открытия склада меньше даты закрытия склада

o Дата открытия склада не больше, чем текущая дата

oДата закрытия склада не больше, чем текущая дата

Таблица Поставщик

oДата подписания договора меньше даты расторжения договора

o Дата подписания договора не больше, чем текущая дата

o Дата расторжения договора не больше, чем текущая дата

oСклад с соответствующим номером еще открыт

Таблица Поставка

oДоговор с соответствующим поставщиком еще не расторгнут

Таблица Покупка

oСотрудник, оформляющий покупку, еще не уволен

o Договор с поставщиком покупаемого лекарства еще не расторгнут

Таблица Сотрудник

o Дата увольнения больше даты приема на работу o Дата приема не больше текущей даты

o Дата увольнения не больше текущей даты

Приведем код создания одного из триггеров, к примеру, на вставку записи в таблицу Поставщик, в приложении 3.

Приведем пример работы триггера. Попробуем закрыть первый склад,

при этом введя дату закрытия больше, чем текущая:

27

В ответ получаем сообщение от сервера:

Убедимся, что изменения не были применены:

28

Заключение

Основным итогом данной курсовой работы я считаю полученные в ходе работы навыки разработки приложений, тесно взаимодействующих с базами данных. Мной была освоена технология проектирования несложных баз данных с нуля, организация работы СУБД. На достаточно серьезном уровне была освоена технология взаимодействия прикладных программ с базами данных, была разобрана определенная часть системы ADO .NET.

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

Что касается дальнейших вариантов развития и использования курсовой работы, то, по моему мнению, возможны следующие расширения функциональности:

Развитие системы взаимодействия с пользователем, не искушенным в вопросах взаимодействия с базами данных. На данном этапе реализованный продукт все-таки рассчитан на пользователя, обладающего определенным уровнем знаний в этой технической области. Кроме того, пока наполнение таблиц данными (особенно таблиц, отвечающей за поставки лекарств и покупку) реализовано сравнительно неудобно (необходимо знать номера лекарств)

Более тонкая настройка СУБД. Так, возможно введение системы аутентификации пользователей с ограничением права доступа (на данном этапе имеется один пользователь с полным доступом ко всей функциональности)

29

Расширение предметной области. К примеру, могут быть введены дополнительные таблицы с целью расширения функциональности в области бухгалтерского учета

30