Каждая функция из MySQL C API-интерфейса в результате своей работы возвращает значение, которое свидетельствует об успешности ее завершения. Так как сам API-интерфейс не производит автоматической обработки ошибок, механизм обработки ошибок должен создаваться разработчиком приложения на прикладном уровне. В простейшем случае этот механизм обработки ошибок заключается в условной проверке после выполнения каждой функции и отображении диагностического сообщения об ошибке, если она имеет место. Этот метод продемонстрирован в следующем примере.
Листинг 19.23.
#include <stdio.h> #include <mysql.h> int main ()
{
/* объявить структуры данных и переменные */ MYSQL mysql;
/* инициализировать структуру MYSQL */
mysql_init(&mysql);
/* подключиться к базе данных */
if (!(mysql_real_connect(&mysql, "localhost", "john", "doe", "db1", 0, NULL, 0)))
{
fprintf(stderr, " Ошибка соединения n"); exit();
}
/* выполнить запрос */
if (mysql_query(&mysql, "SELECT FROM books") != 0)
{
fprintf (stdout, " Ошибка в запросе n"); exit();
}
else
{
fprintf(stdout, " Запрос выполнен успешно n");
}
/* очистка */ mysql_close(&mysql);
}
В том случае, когда какой-либо из запросов функции возвращает ошибку (например, при вызове функции mysql_query() , т.к. в строке запроса содержится ошибка), выводится сообщение об ошибке и инициируется выход из программы.
Этот примитивный механизм обработки ошибок можно дополнить двумя мощными функциями обработки ошибок, которые делают сообщения об ошибках более точными и понятными пользователю. Посмотрим, как они работают на следующем примере, который дополняет предыдущий, и в котором используются функций mysql_error() и mysql_errno() .
Листинг 19.24.
#include <stdio.h> #include <mysql.h> int main ()
{
/* объявить структуры данных и переменные */ 
MYSQL mysql;
/* инициализировать структуру MYSQL */
mysql_init(&mysql);
/* подключиться к базе данных */
if (!(mysql_real_connect(&mysql, "localhost", "john", "doe", "db1", 0, NULL, 0)))
{
fprintf(stderr, " Ошибка соединения: %s [ код %d]n", mysql_error(&mysql), mysql_errno(&mysql))); exit();
}
/* выполнить запрос */
if (mysql_query(&mysql, "SELECT FROM books") != 0)
{
fprintf (stdout, " Ошибка в запросе %s [ код %d]n", mysql_error(&mysql), mysql_errno(&mysql)); exit();
}
else
{
fprintf(stdout, " Запрос выполнен успешно n");
}
/* очистка */ mysql_close(&mysql);
}
Функция mysql_errno() отображает код последней ошибки, возвращенный MySQL, а функция mysql_error() возвращает текстовое сообщение о последней ошибке. Работу этих функций вы уже видели в действии в некоторых предыдущих примерах.
Вспомогательные функции, предназначенные для обработки ошибок, перечислены в табл. 19.2.
Вспомогательные функции
API-интерфейс C также включает множество функций, разработанных специально для получения информации о текущем состоянии сервера и для получения имеющихся данных по базам данных и таблицам. Эти функции используются не так часто, как вышеупомянутые функции, но с ними имеет смысл познакомиться. Краткий перечень этих функций можно найти в табл. 19.3.
Обработка ошибок
Обработка ошибок
Ниже представлен пример работы некоторых из них.
Листинг 19.25.
#include <stdio.h> #include <mysql.h> int main () {
/* объявить структуры данных и переменные */
MYSQL mysql;
MYSQL_RES *dbs;
MYSQL_ROW db;
MYSQL_RES *tbls;
MYSQL_ROW tbl;
/* инициализировать структуру MYSQL */
mysql_init(&mysql);
/* подключиться к базе данных */
if (!(mysql_real_connect(&mysql, "localhost", "root", "secret",
NULL, 0, NULL, 0))
{
fprintf(stderr, " Ошибка соединения: %sn", mysql_error(&mysql)); exit();
}
/* вывести информацию клиент/сервер */
fprintf(stdout, " подключение к серверу на узле %sn", mysql_get_host_info(&mysql));
fprintf(stdout, " версия сервера %sn", mysql_get_server_info(&mysql));
fprintf(stdout, " версия клиента %sn", mysql_get_client_info());
fprintf(stdout, "n");
/* перечень баз данных */
dbs = mysql_list_dbs(&mysql, NULL);
/* Просмотр перечня баз данных и распечатка их имен */ while(db = mysql_fetch_row(dbs))
{
fprintf(stdout, "%s: ", db[0]);
/* выбрать эту базу данных в качестве рабочей и получить спи­сок таблиц */
mysql_select_db, (&mysql db[0]);
tbls = mysql_list_tables(&mysql, NULL);
/* распечатать таблицы из этой базы данных */
while(tbl = mysql_fetch_row(tbls))
{
fprintf (stdout, "%s ", tbl[0]);
{
fprintf(stdout, "n");
mysql_free_result(tbls);
 } 
mysql_free_result(dbs); /* закрыть соединение */ mysql_close(&mysql);
}
И еще одна таблица - 19.4. В ней приводится перечень функций, которые могут при­годиться при разработке приложений.
Обработка ошибок