Установка соединения с СУБД MySQL по существу является двухшаговым процессом. Первый шаг заключается в вызове функции mysql_init() для инициализации структуры MYSQL. Эта структура служит своеобразной стартовой точкой для всех будущих взаимодействий с сервером.
Листинг 19.5.
mysql_init(&mysql);
Затем для установки соединения с сервером используется функция mysql_real_ connect() . 
Листинг 19.6.
mysql_real_connect(&mysql, "localhost", "joe", "secret",
"db1", 0, NULL, 0);
Как видно из предыдущего фрагмента, функции mysql_real_connect() передается несколько различных аргументов, необходимых для успешной установки соединения: структура MYSQL, предварительно инициализированная функцией mysql_init() , имя узла, на котором работает сервер MySQL, имя и пароль пользователя, необходимые для регистрации на сервере, и имя используемой базы данных.
Меняя мнение
Обычно база данных, на которой будут выполняться ваши запросы, задается во время подключения к серверу с помощью функции mysql_real_connect(). Однако базу данных можно поменять в любой момент с помощью функции mysql_ select_db(), которая, собственно, принимает в виде аргумента имя базы данных:
/* выбрать новую базу данных "db678" */ mysql_select_db(&mysql, "db678");

При установке успешного соединения, эта функция возвращает дескриптор соединения. Этот дескриптор используется для всех последующих обменов данными с базой данных. В случае сбоя соединения, что вероятно из-за ошибочных параметров регистрации или неверного имени узла, функция возвратит значение "ложь". Неплохо в данном случае проверить возвращаемое значение этой функции в сценарии перед продолжением работы алгоритма, как показано в следующей простой программе.
Листинг 19.7.
#include <stdio.h> #include <mysql.h> int main()
{
/* объявление структуры MYSQL */ MYSQL mysql;
/* инициализация структуры */ mysql_init(&mysql);
/* попытка подключения и распечатка сообщения */
if (!mysql_real_connect(&mysql, "localhost", "tim", "abracadbra",
"mysql", 0, NULL, 0);
{
printf("Невозможно подключиться к серверу MySQLn");
}
else
{
printf ("Соединение прошло успешно n") ;
}
/* закрыть соединение и очистить */ mysql_close(&mysql);
}
Здесь функция mysql_real_connect() пробует открыть соединение с базой данных, используя при этом параметры доступа, заданные в вызове функции. Если это действие завершается успешно и возвращает значение "истина", печатается соответствующее сообщение. В противном случае (попытка соединения не удалась) возвращается значение NULL и печатается сообщение об ошибке. Сбой в работе функции mysql_real_ connect() может быть вызван рядом причин. В руководстве по MySQL, имеющемся по адресу http://www.mysql.com/, дан перечень всех этих причин и кодов ошибок, а также примеры по обработке этих ошибок. В предыдущем примере для простоты в коде были жестко запрограммированы имя базы данных, имя пользователя и его пароль. В последующих примерах будет использоваться более традиционный подход, позволяющий считывать эти параметры из конфигурационного файла или командной строки.
Соединение можно разорвать с помощью функции mysql_close() , передав ей структуру, созданную функцией mysql_init() .
Листинг 19.8.
mysql_close(&mysql); Вглядываясь пристальнее
Вероятно, вы заметили, что в приведенном примере функции mysql_real_ connect() передается восемь аргументов, а не пять, которые были только что описаны. Дополнительными тремя аргументами являются:
• порт, используемый для подключения к серверу MySQL;
• разъем, используемый для подключения к серверу MySQL;
• один (и более) необязательный флаг, используемый для управления поведением клиента.
В большинстве случаев не стоит беспокоиться об этих трех аргументах, т.к. обычно используются их значения, принятые по умолчанию (как в примерах этой главы). Но если вы хотите узнать о них больше, полистайте руководство по MySQL.
Если в вашей программе используются новые возможности поддержки транзакций MySQL 4.1, для включения/отключения режима автовыполнения MySQL примените функцию mysql_autocommit() .
Еще одной хорошей идеей является вызов функции mysql_commit() или mysql_ rollback() перед вызовом mysql_close() . Это позволит завершить транзакцию полностью.
Листинг 19.9.
mysql_autocommit(&mysql, 0); /* выключить режим автовыполнения */ /* выполнить транзакцию */ if (success) {
mysql_commit(&mysql); /* выполнить транзакцию */ } else {
mysql_rollback(&mysql); /* откат транзакции */
}