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