Основы программирования в Linux - Страница 148
Когда вы запустите программу, должно появиться сообщение об успешном подключении:
$ ./connect1Connection success $В главе 9 мы покажем, как создать make-файл и автоматизировать процесс подключения.
Как видите, подключиться к базе данных MySQL очень легко.
Обработка ошибок
Прежде чем мы перейдем к более сложным программам, полезно взглянуть на то, как MySQL обрабатывает ошибки. СУРБД MySQL использует ряд возвращаемых числовых кодов, предоставляемых дескриптором подключения. К двум обязательным подпрограммам относятся следующие:
unsigned int mysql_errno(MYSQL *connection);и
char *mysql_error(MYSQL *connection);Вы можете получить код ошибки, обычно любое ненулевое значение, вызвав подпрограмму
mysql_errnoВозвращаемое значение — в действительности код ошибки, коды ошибок определены в файле
includeЕсли вы предпочитаете текстовое сообщение об ошибке, можно вызвать подпрограмму
mysql_errorВы можете вставить элементарную обработку ошибок в вашу программу для того, чтобы увидеть все это в действии. Возможно, вы уже заметили, что можно столкнуться с проблемой, поскольку подпрограмма
mysql_real_connectNULLmysql_real_connectДалее приведен файл connect2.c, демонстрирующий, как применять структуру дескриптора подключения без динамического выделения памяти для нее, а также как написать некоторый базовый программный код обработки ошибок. Внесенные изменения выделены цветом.
#include <stdlib.h>#include <stdio.h>#include "mysql.h"int main(int argc, char *argv[]) { MYSQL my_connection; mysql_init(&my_connection); if (mysql_real_connect(&my_connection, "localhost", "rick", "I do not know", "foo", 0, NULL, 0)) { printf("Connection successn"); mysql_close(&my_connection); } else { fprintf(stderr, "Connection failedn"); if (mysql_errno(&my_connection)) { fprintf(stderr, "Connection error %d: %sn", mysql_errno(&my_connection), mysql_error(&my_connection)); } } return EXIT_SUCCESS;}Вы смогли легко решить проблему, устранив перезапись вашего дескриптора подключения результатом, возвращаемым при аварийном завершении
mysql_real_connectmysql$ ./connect2Connection failedConnection error 1045: Access denied for user: '[email protected]' (Using password: YES)$Выполнение SQL-операторов
Теперь, когда вы можете подключаться к вашей базе данных и корректно обрабатывать ошибки, самое время дать вашей программе реальную работу. У основной функции API, предназначенной для выполнения операторов языка SQL, подходящее имя.
int mysql_query(MYSQL *connection, const char *query);He слишком сложная? Эта подпрограмма принимает указатель на дескриптор подключения и несколько, хочется надеяться, корректных SQL-операторов в виде текстовой строки (без завершения каждого из них точкой с запятой, как в мониторе
mysqlmysql_real_querymysql_queryДля простоты начнем с рассмотрения нескольких SQL-операторов, которые не возвращают данные:
UPDATEDELETEINSERTЕще одна важная функция, которую мы рассмотрим, проверяет количество строк, затронутых запросом:
my_ulonglong mysql_affected_rows(MYSQL *connection);Первое, что вы, вероятно, заметили в этой функции, — очень необычный тип возвращаемых данных. Из соображений переносимости применяется беззнаковый (unsigned) тип. Когда используется функция
printfunsigned long%luUPDATEINSERTDELETEWHERE