СУБД (cистема управления базами данных) MySQL давно пользуется заслуженной популярностью в среде web-программистов. В связке с PHP она образует мощный инструмент, позволяющий решать самые сложные задачи, возникающие перед создателями сайтов. Причин популярности MySQL довольно много, но наиболее значимыми, на мой взгляд, являются бесплатность, доступ к исходным текстам СУБД, высокая скорость работы. Сегодня я хотел бы рассказать о том, как писать Windows-приложения, использующие эту СУБД.
Зачем мне это нужно? Ответ на этот вопрос очевиден для тех, кто пытался перенести данные из одной базы данных в другую, скажем, из MS Access в MySQL. Такая задача довольно часто возникает, когда требуется разместить базу данных в Интернете и не удается найти нужный хостинг, либо он слишком дорог. Конечно, этой проблемы можно было бы избежать, если бы с самого начала использовать MySQL, но командная строка отпугивает пользователей, живущих в «мелко-мягких» окошках. А кто мешает нам написать интерфейс а-ля MS Access? За дело!
Перед началом разработки программы следует убедиться в наличии необходимого ПО. Во-первых, должна быть установлена сама СУБД. Я не буду подробно останавливаться на установке MySQL — этой теме не раз уделялось внимание на полосах МК, скажу лишь, что дистрибутив ее можно получить с официального сайта разработчика http://www.mysql.com. Распространяется MySQL в соответствии с лицензией GPL (бесплатно для некоммерческого использования). Во-вторых, нам понадобится компилятор языка программирования. Быть может, Visual C++ 6.0 — не самое лучшее средство для работы с базами данных, но мой выбор пал именно на него. Об остальном ПО, которое потребуется, я расскажу по ходу дела.
В своих дальнейших рассуждениях я буду исходить из того, что MySQL установлена по умолчанию в папку C:\mysql\, а Visual C++ , опять же по умолчанию, — в C:\Program Files\Microsoft Visual Studio\Vc98\.
Создадим базу данных. Для этого необходимо перейти в каталог c:\mysql\bin\ и выполнить команду mysqladmin create mybase , где mybase — имя создаваемой базы данных. Если возникнут ошибки, проверьте, запущен ли сервер базы данных (mysqld.exe). Следующий шаг — запуск mysql.exe; на экране должна появиться подсказка mysql >, сообщающая о готовности СУБД принимать команды пользователя. Выполним следующую последовательность команд:
mysql > USE mybase; mysql > CREATE TABLE friends (name VARCHAR(25), phone VARCHAR(10), email VARCHAR(20)) ; mysql > INSERT INTO friends (name, phone, email) VALUES (‘vasja’, ‘232-43-65’, ‘vasja@tut.by’), (‘sasha’, ‘264-43-78’, ‘sasha@tut.by’), (‘masha’, ‘270-93-17’, ‘masha@tut.by’);
Чтобы порадоваться плодам нашей работы, введем команду:
mysql > SELECT * FROM friends;
Если вы созерцаете на экране монитора таблицу friends и три строки с данными, то можете со спокойной душей набирать quit — создание базы данных успешно завершено.
Чтобы получить доступ к базе данных из Си-программы, можно использовать либо функции MySQL API, либо ODBC-драйвер. Рассмотрим первый вариант.
Скопируем файлы, находящиеся в каталоге C:\mysql\include\, в каталог C:\Program Files\Microsoft Visual Studio\Vc98\Include. Далее копируем файл C:\mysql\lib\opt\libMySQL.dll в системный каталог (для Windows 9x по умолчанию это каталог с:\windows\system\), а оставшиеся файлы из каталога C:\mysql\lib\opt\ — в C:\Program Files\Microsoft Visual Studio\Vc98\Lib.
После того как все приготовления проведены, запускаем Visual C++ и создаем консольное приложение (Win32 Console Application). Вводим текст программы:
#include #include #include MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; int main() { int i = 0; if (!(mysql_connect(&mysql,"localhost","",""))) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(1); } if (mysql_select_db(&mysql,"mybase")) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(2); } if (mysql_query(&mysql,"SELECT * FROM freinds")) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(3); } if (!(res = mysql_store_result(&mysql))) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(4); } while((row = mysql_fetch_row(res))) { for (i=0 ; i < mysql_num_fields(res); i++) printf("%s\t",row[i]); printf("\n"); } if (!mysql_eof(res)) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(5); } mysql_free_result(res); mysql_close(&mysql); }
Перед сборкой проекта необходимо подключить библиотеку libmysql.lib; для этого выбираем пункт меню Project > Settings, на вкладке Link в конец строки Oject/Library Modules добавляем libmysql.lib. Теперь можем смело жать F7 и запускать на выполнение нашу программу. На экран монитора должен вывестись список друзей с телефонами и адресами электронной почты, содержащийся в созданной нами ранее базе данных.
Для начинающих программистов прокомментирую программу. Чтобы установить соединение с СУБД, вызывается функция mysql_connect(). Она описана следующим образом:
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)
где:
*mysql — указатель на структуру MYSQL;
*host — указатель на строку, содержащую адрес компьютера в сети, на котором установлена СУБД (в нашем случае СУБД установлена на локальном компьютере);
*user — указатель на строку, содержащую имя пользователя (если не задано, подразумевается текущий пользователь);
*passwd — указатель на строку, содержащую пароль.
Функция возвращает указатель на структуру MYSQL, если удалось установить соединение с базой данных, и NULL — в противном случае. Тип ошибки можно получить, используя функцию mysql_error().
Далее следует выбрать базу данных с помощью функции
int mysql_select_db(MYSQL *mysql, const char *db).
*mysql здесь — указатель, полученный функцией mysql_connect(), а *db — указатель на строку с именем базы данных.
После того как база данных выбрана, можно посылать SQL-запрос на выборку данных, для чего применяется функция int mysql_query (MYSQL *mysql, const char *query), где *query — указатель на строку, содержащую запрос. В случае успешного выполнения операции функция возвращает 0.
Затем вызываем функцию MYSQL_RES *mysql_store_result (MYSQL *mysql), которая передает результат запроса клиенту, в случае успеха возвращает указатель на структуру MYSQL_RES, а если произошла ошибка или данных для выборки нет — NULL. Когда полученные данные больше не нужны, требуется освободить занимаемую память вызовом функции void mysql_free_result (MYSQL_RES *result).
Для получения строки данных из результата запроса применяем функцию MYSQL_ROW mysql_fetch_row(MYSQL_RES *mysql). Функция вернет NULL, когда строки закончатся. Количество полей в строке получаем функцией int mysql_num_fields (MYSQL_RES *result). Функция int mysql_eof (MYSQL_RES *) вернет ненулевое значение, если достигнут конец набора результатов.
После окончания работы с базой данных вызовом функции mysql_close (MYSQL *mysql) закрываем соединение с СУБД.
Конечно, MySQL API не ограничивается лишь приведенными мной функциями, на самом деле их гораздо больше, я упомянул только о тех, без которых не может обойтись ни одно приложение.
Если помните, в начале статьи я сказал, что работать с базой данных можно, используя ODBC-драйвер. Что же такое ODBC?
Open Database Connectivity (ODBC) —открытый интерфейс доступа к базам данных, позволяющий приложению обращаться к различным СУБД с помощью структурированного языка запросов SQL. Применение ODBC позволяет программисту писать приложения, не зависящие от архитектуры конкретной СУБД. Будь то MySQL, MS Access или Oracle — для разработчика это не имеет принципиального значения, ведь работа с ними ведется совершенно одинаково.
Для того чтобы написать приложение для работы с СУБД MySQL через ODBC, необходимо установить MyODBC-драйвер, получить который можно найти на странице , где следует искать желательно последнюю версию для Windows. Для тех, кому лень это делать, привожу прямую ссылку на мой сайт: .
После установки данного драйвера необходимо создать источник данных. Идем в Панель управления, выбираем Источники данных ODBC, и перед нами открывается окно Администратор источников данных ODBC. Нажимаем кнопку Добавить, и в окне Создание нового источника данных выбираем MySQL ODBC 3.51 Driver (номер версии драйвера может отличаться). В следующем окне введите имя источника данных (Data Source Name). Заполнение оставшихся полей не должно вызвать затруднений у человека, который хоть раз в жизни настраивал СУБД, поэтому приводить описание этих действий не считаю необходимым. Нажатием кнопки Test Data Source проверяем доступность источника данных, и если все в порядке, можем приступать к написанию кода программы.
Дальнейший процесс создания приложения не зависит от конкретной базы данных и достаточно хорошо описан в литературе по программированию.
Таким образом СУБД MySQL можно применять не только в Интернете, но и в небольшой локальной сети или даже одном компьютере, причем для этого необязательно использовать web-интерфейс.
В заключение хочется сказать, что автор не считает MySQL панацей от всех бед и ни в коем разе не агитирует разработчиков ПО переключиться исключительно на ее использование. MySQL — это всего лишь СУБД, со своими достоинствами и недостатками. Выбор как всегда за вами.
