Каждая функция из 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. В ней приводится перечень функций, которые могут пригодиться при разработке приложений.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Обработка ошибок
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Обработка результирующего набора. Часть Третья. | Все о MySQL. Практическое применение C API-интерфейса MySQL |