Потенциальные преимущества при работе с SQL исходят из самой природы этого языка структурированных запросов - будучи универсальным средством обращения к реляционным БД под управлением большинства СУБД, этот язык позволяет значительно сократить ресурсные и временные затраты на обращение к внешней базе данных из тела программы, написанной на каком-либо языке программирования. То, что можно реализовать технически без SQL, например, в рамках C++, уже реализовано в стандарте SQL и может быть выполнено посредством добавления нескольких стандартных функций и запросов в тело программы.
Также большим преимуществом является возможность интегрировать SQL сразу в несколько компонентов одной системы, написанной с использованием разных языков программирования - например, WEB-компонент системы, написанный на Javascript, и внутренняя, инкапсулированная от пользователей часть на C++, могут использовать SQL в равной степени, создавать запросы, подключаться в БД по мере необходимости и так далее. Эта возможность еще сильнее повышает универсальность системы. В трех следующих подразделах будут представлены практические примеры использования SQL в рамках трех языков: Pascal (выбран как наиболее хорошо демонстрирующий возможности программирования для начинающих специалистов), C++ (выбран как язык с чрезвычайно широкими возможностями, использующийся повсеместно и породивший множество родственных языков), Object ABAP (данный специфический пример позволит увидеть, каким образом SQL можно интегрировать в язык напрямую, без использования расширений).
3.2 Использование SQL
в Pascal (на примере Pascal
Lazarus)
Pascal, не являясь популярным языком разработки коммерческих приложений, тем не менее, очень распространен в учебных заведениях по причине наглядности многих его аспектов. Поэтому первым языком, в рамках которого будет рассмотрено использование SQL, выбран именно Pascal.
Технически, однако, в данном примере будет показан не Pascal в чистом виде, а его объектная версия, используемая в графической среде разработки Lazarus. Lazarus является бесплатным аналогом популярного инструмента Delphi, потому работа с ним может также дать представление об устройстве этого продукта.
Для подробного разбора механики соединения с базой данных MySQL посредством языка Pascal все операторы необходимо прописывать вручную (подключение к хосту и так далее). Однако Lazarus существенно облегчает задачу программиста посредством множества готовых классов, объекты которых можно разместить на форме программы по аналогу с Delphi и получить в свое распоряжение мощные инструменты для подключения к базам данных различных СУБД и для других задач.
На рисунке 9 показаны строки с объектами,
предназначенными для подключения к различным СУБД в программе Lazarus
и для управления данными, полученными из баз данных:
Рисунок 9: Инструменты для работы с базами
данных в Lazarus
(желтым выделены наиболее важные для работы с MySQL)
Для успешного подключения к БД и работы с ней на форме необходимо разместить следующие четыре объекта: MySQL50Connection (число в названии объекта должно соответствовать выпуску базы данных), SQLQuery, DataSource, SQLTransaction. Первый из объектов выступает главным звеном цепи, подключающимся к самой СУБД. SQLQuery содержит в себе SQL-запрос, а также актуальную выборку из таблиц БД, DataSource является источником данных для SQLQuery, а SQLTransaction - это транзакция, также связанная с запросами из SQLQuery. В каждом из этих объектов должны быть ссылки на другие, а в MySQL50Connection также указаны основные данные подключения к БД: адрес хоста, имя пользователя и пароль.
В реализованном тестовом приложении данные для подключения вводятся в специальные текстовые поля на форме.
Для вывода результатов запроса был добавлен объект класса Tmemo - набор текстовых строк. Программа процедурально выводит в него выборку, полученную из SQLQuery. Для ввода нового запроса был добавлен еще один объект класса Tmemo.
Прежде чем отправлять запросы к БД, необходимо установить соединение. Для этого используется изменение значения свойства 'Connected' у MySQL50Connection на 'true':50Connection1.Connected := true
Кроме установки подключения необходимо выполнить и другие действия (активация транзакции, заполнение тела запроса и так далее). Все эти действия указаны в полном листинге тестовой программы в приложении В.
Как показала практика, составление и отправка запросов не представляют сложности при использовании Lazarus: обычная текстовая строка, которую пользователь вводит в текстовое поле, по нажатию кнопки передается в объект SQLQuery, которые затем отправляет ее по соединению в СУБД. Результат (в том числе, текст возможной ошибки) возвращается в этот же объект, из которого программа затем может получить необходимые данные.
Этот принцип работает не только с выборкой, но и с редактированием, и с удалением записей. Более того, в реализованной программе отсутствует зависимость от конкретной таблицы - процедуры построены таким образом, что программа сама формирует выводимый список, в зависимости от того, с какой таблицей работает. Однако в силу тестовой природы этого решения было решено не заострять внимание на внешнем виде графической оболочки - главное, чтобы программа выполняла поставленные функции.
Работа с Pascal и Lazarus дала представление об удобстве как языка, так и программной среды в случае проектирования программы небольшого масштаба и сложности. Кроме возможности подключить СУБД MySQL Lazarus позволяет теми же стандартными средствами подключаться к другим системам управления базами данных, что является несомненным плюсом.
На рисунке 10 изображено окно получившейся
программы с результатами выборки:
Рисунок 10: Окно тестовой программы, созданной в
Lazarus
3.3 Использование SQL
в C++ (на примере MS
Visual Studio)
Язык C++ предоставляет широкие возможности для разработки проектов любой сложности, однако изучение всех сторон его природы может потребовать много времени. Особенным преимуществом этого языка является возможность подключения множества дополнительных файлов и библиотек, которых конкретно для C++ было разработано огромное количество.
Тем не менее, именно подключение внешних компонентов может стать узким местом при разработке для этого языка. В частности, для работы с СУБД MySQL приложение должно использовать файл mysql.h и еще несколько библиотек MySQL кроме него, однако особенности среды разработки MS Visual Studio могут помешать программе отыскать правильные файлы, если не указать путь к ним явно. Именно такая проблема и возникла при создании проекта на C++ в Visual Studio. Решена эта проблема была добавлением необходимых библиотек (libmysql.dll, libmysql.lib, libmysqld.dll, libmysqld.lib) из каталога с сервером MySQL в корневой каталог проекта [22].
Разработанное тестовое приложение является консольной программой Windows - по причине того, что в рамках данной работы необходимо продемонстрировать основные возможности работы языка SQL в рамках прикладного программирования, а также сравнить различные способы интеграции этого языка в приложения, графический интерфейс можно в принципе опустить.
После успешного добавления файлов windows.h, winsock.h и mysql.h с помощью стандартного служебного слова include, проект может работать с СУБД MySQL посредством функций, взятых из специально разработанных для этого библиотек.
Для подключения к базе данных создается коннектор:
MYSQL *<имя_переменной>;
Затем выполняется подключение как таковое посредством следующих функций:
= mysql_init(NULL);
//функция подключения выведена в оператор
ветвления для проверки успешного подключения
if (!mysql_real_connect(conn, "localhost", "root", "root", "test", NULL, NULL, 0))
{(stderr, "Ошибка: невозможно подключиться к базе данных\n");
}
После успешного подключения можно отсылать запросы к базе данных посредством функции mysql_query.
Несмотря на кажущуюся бедность функционала в сравнении с Lazarus, C++, даже в варианте консольного приложения, предоставляет широкие возможности для работы с базами данных. Возможно, именно по причине широких возможностей этого языка при работе в нем с базами данных можно столкнуться с многочисленными ошибками. Кроме того, следует отметить, что, будучи разработкой компании Microsoft, Visual Studio предоставляет куда больше возможностей по работе с СУБД той же самой фирмы (Microsoft SQL Server, MS Access)[7].
Полный листинг тестовой программы с возможностью
посылать SQL-запросы к
базе данных можно найти в приложении.
3.4 Использование SQL
в ABAP (на примере SAP
GUI)
В качестве третьего примера была взята достаточно специфичная технология - язык программирования высокого уровня ABAP на платформе, для которой он и был разработан - SAP GUI.GUI сам по себе является обширным инструментарием работы с разнообразными бизнес-системами SAP - аналогом отечественного 1C. SAP GUI позволяет как администрировать систему, так и вести разработки в ней. Очевидно, что всякое бизнес-приложение в той или иной мере должно обращаться к базам данных - отсюда следует, что технология, на которой приложение построено, должна поддерживать общение с базами данных на том или ином языке.
В случае ABAP технология была интегрирована в язык еще на стадии разработки - для осуществления SQL-запросов не требуется подключать никаких внешних файлов. Более того, сама семантика языка ABAP не делает различий между фактической таблицей, существующей в базе данных, и временной таблицей, созданной в процессе выполнения программы - в обоих случаях обращение к таблицам будет вестись посредством SQL-запросов. Это многократно облегчает задачи программистов и позволяет достичь высоких результатов при программировании обращений к базам данных [20].
Тем не менее, ABAP имеет множество недостатков. В первую очередь, это морально устаревшая концепция, сама архитектура языка, который не обладает той же гибкостью, что C или C++. Недостатки эти, однако, слабо связаны с SQL и технологией обращения к БД, так что в данном случае могут быть опущены.
Кроме прочего, системы SAP (по сути, единственный род приложений, использующих ABAP) подключаются к базам данных напрямую, посредством специально для этого разработанных технологий. Это значит, что при наличии рабочей системы SAP, подключенной к корректно построенной базе данных, разработка кода может вестись без оглядки на проблемы с подключением, различные коннекторы и объекты, посредством которых осуществляется соединение, - эта часть системы абстрагирована от пользовательских разработок. Таким образом, прямо в теле кода ABAP можно записывать SQL-запросы, которые при выполнении программы будут выполнены в том порядке, в каком они идут. При этом не нужно описывать фактические таблицы наравне с переменными - они берутся из общего списка таблиц, релевантного для всей системы [23].
На рисунке 11 продемонстрирован фрагмент кода,
где видно, что вместе с SQL-запросами выполняются обычные операторы языка, а
сами запросы применяются как для таблиц базы данных, так и для внутренних
таблиц, созданных по ходу выполнения программы.
Рисунок 11: Фрагмент кода на языке ABAP
поддерживает большинство функций языка SQL.
Кроме широких возможностей ABAP программист может расширить его функционал
посредством привязки к системе решений, построенных на других технологиях.
Обновление SAPUI5 является прекрасным примером такой связки: WEB-часть проекта,
написанная на Javascript, отправляет и получает данные из ABAP. При этом на
стороне Javascript могут формироваться SQL-запросы, которые затем отправляются
в систему через технологию Gateway. Однако, как и было замечено, ABAP является
специфическим языком, созданным специально для систем SAP. Его применение за
пределами таких систем, в принципе, невозможно, и в данной работе язык был
приведен лишь в качестве примера того, как глубоко SQL может быть интегрирован
с технологией программирования.
.5 Сравнение результатов использования SQL в
различных языках программирования
Из трех приведенных примеров каждый язык программирования обладает яркими особенностями использования в нем SQL-запросов. в среде разработки Lazarus отличается удобством использования и наглядностью - вследствие объектно-ориентированного подхода к программированию. Среди заготовленных классов коннекторов есть способные подключаться к различным СУБД - не только MySQL. Классы запросов получают от базы данных подробную информацию о том, как был выполнен запрос, что позволяет видеть текст ошибки при выполнении программы, даже если не были прописаны соответствующие исключения.
Язык C++, в свою очередь, отличается фундаментальностью инструментов - для подключения к базе данных необходимо использовать внешние библиотеки, описывать подключение и предугадывать все возможные ошибки. Это добавляет сложности процессу разработки. Тем не менее, C++ является чрезвычайно многогранным средством, с помощью которого можно реализовать масштабные проекты.
Язык ABAP
представляет собой далекое от универсальности средство, предназначенное, в
принципе, для работы с базами данных в бизнес-среде SAP.
Это налагает жесткие ограничения на возможности языка как такового, однако
уровень интеграции SQL
в него так велик, что никаких дополнительных действий для подключения к базе
данных внутри кода, в принципе, делать не нужно - SQL-запросы
пишутся как часть общей программы и выполняются так же. Таким образом можно
сказать, что Lazarus
наиболее подходит для разработок малых и средних приложений, работающих с
базами данных, C++ в среде Visual
Studio - для более крупных
программ, а ABAP, будучи
самым удобным в плане работы с SQL,
можно использовать только в рамках SAP.
ЗАКЛЮЧЕНИЕ
В первом разделе данной курсовой работы была рассмотрена концепция баз данных, выведены причины формирования этой технологии из файловых систем, даны общие определения из разных источников и на их основе выведено общее определение базы данных, как набора структурированных и доступных для дальнейшей обработки данных.
Также были описаны основные характеристики баз данных: модели данных, приведены основные разновидности моделей с описанием их особенностей; тип данных, которые содержатся в базе; фактор распределенности базы данных.
Из наиболее популярных моделей данных в современной информационной науке отдельное положение занимает реляционная, основанная на отношениях (таблицах) и связях между ними. Имея большие преимущества в контексте использования на практике, при информационном моделировании реальных объектов и связей между ними, реляционная модель применяется в проектировании баз данных чаще всего.
После определения баз данных и их основных свойств было дано описание систем управления базами данных - СУБД: это программный инструмент создания, управления и доступа к базе данных того типа, для которого была создана данная СУБД. По причине распространенности реляционных баз данных наибольшее развитие получили именно реляционные СУБД. Среди них: Microsoft Access, MySQL, Firebird и другие.
Остановившись на реляционных базах данных была подробнее описана их модель: отношения, связи между ними, принципы существования такой модели. Только обладая знаниями в теории реляционных БД, можно переходить к более узким дисциплинам - в частности, языку SQL. Исходя из особенностей реляционной модели, можно прийти к выводу о том, что она является наиболее подходящей для наглядного проектирования базы данных и понятна среднему пользователю, но имеет также некоторые недостатки, из которых главным является избыточность данных. Перед изучением языка SQL был показан процесс концептуального моделирования реляционной базы данных с использованием схемы «сущность - связь» либо языка UML.
Язык SQL, как основной стандарт обращения к реляционным базам данных, получил большое развитие. За годы его совершенствования было создано несколько стандартов, а также диалектов, разработанных специально для конкретных технологий.