Справочное руководство по MySQL версии 4.1.1-alpha

       

Если указывается флаг CLIENT_FOUND_ROWS при


mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"); printf("%ld products updated",(long) mysql_affected_rows(&mysql));
Если указывается флаг CLIENT_FOUND_ROWS при подключении к mysqld, то mysql_affected_rows() возвратит количество строк, соответствующих выражению WHERE для команд UPDATE.
Следует отметить, что при использовании команды REPLACE функция mysql_affected_rows() возвратит значение 2, если новая строка заменила старую. Это происходит по той причине, что в данном случае одна строка была внесена после того как дублирующая была удалена.


if (mysql_change_user(&mysql, "user", "password", "new_database")) { fprintf(stderr, " Failed to change user. Error: %s\n", mysql_error(&mysql)); }


if(mysql_create_db(&mysql, "my_database")) { fprintf(stderr, " Failed to create new database. Error: %s\n", mysql_error(&mysql)); }


Представленный здесь вызов функции заставляет библиотеку клиента генерировать трассировочный файл в каталоге `/tmp/client.trace' на клиентской машине:
mysql_debug("d:t:O,/tmp/client.trace");


if(mysql_drop_db(&mysql, "my_database")) fprintf(stderr, " Failed to drop the database: Error: %s\n", mysql_error(&mysql));


Следующий пример иллюстрирует применение mysql_eof():
mysql_query(&mysql,"SELECT * FROM some_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // делаем что-то с данными } if(!mysql_eof(result)) // mysql_fetch_row() сбойнул из-за ошибки { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); }
Того же эффекта вы можете достичь с помощью стандартных функций ошибок MySQL:


mysql_query(&mysql,"SELECT * FROM some_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // что-то делаем с данными } if(mysql_errno(&mysql)) // mysql_fetch_row() сбойнул из-за ошибки { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); }


MYSQL_FIELD *field; while((field = mysql_fetch_field(result))) { printf(" field name %s\n", field->name); }


unsigned int num_fields; unsigned int i; MYSQL_FIELD *field; num_fields = mysql_num_fields(result); for(i = 0; i < num_fields; i++) { field = mysql_fetch_field_direct(result, i); printf("Field %u is %s\n", i, field->name); }


unsigned int num_fields; unsigned int i; MYSQL_FIELD *fields;
num_fields = mysql_num_fields(result); fields = mysql_fetch_fields(result); for(i = 0; i < num_fields; i++) { printf("Field %u is %s\n", i, fields[i].name); }


MYSQL_ROW row; unsigned long *lengths; unsigned int num_fields; unsigned int i;
row = mysql_fetch_row(result); if (row) { num_fields = mysql_num_fields(result); lengths = mysql_fetch_lengths(result); for(i = 0; i < num_fields; i++) { printf("Column %u is %lu bytes in length.\n", i, lengths[i]); } }


MYSQL_ROW row; unsigned int num_fields; unsigned int i;
num_fields = mysql_num_fields(result); while ((row = mysql_fetch_row(result))) { unsigned long *lengths; lengths = mysql_fetch_lengths(result); for(i = 0; i < num_fields; i++) { printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL"); } printf("\n"); }


MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows;
if (mysql_query(&mysql,query_string)) { // ошибка } else // запрос выполнен, обработка возвращенных им данных { result = mysql_store_result(&mysql); if (result) // содержит строки { num_fields = mysql_num_fields(result); // извлечение строк, затем вызов mysql_free_result(result) } else // mysql_store_result() не вернула ничего; может ли что-либо вернуть? { if(mysql_field_count(&mysql) == 0) { // запрос не возвращает данные // (запрос не был вида SELECT) num_rows = mysql_affected_rows(&mysql); } else // mysql_store_result() должна была вернуть данные { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); } } }
Альтернатива состоит в замене вызова функции mysql_field_count(&mysql) вызовом функции mysql_errno(&mysql). В этом случае можно проверить, была ли данная команда вида SELECT, непосредственно по ошибке от mysql_store_result(), а не делать логический вывод по величине функции mysql_field_count().


MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows;
if (mysql_query(&mysql,query_string)) { // ошибка } else // запрос выполнен, обработка возвращенных им данных { result = mysql_store_result(&mysql); if (result) // содержит строки { num_fields = mysql_num_fields(result); // извлечение строк, затем вызов mysql_free_result(result) } else // mysql_store_result()не вернула ничего; может ли что-либо вернуть? { if (mysql_errno(&mysql)) { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); } else if (mysql_field_count(&mysql) == 0) { // запрос не возвращает данные // (запрос не был вида SELECT) num_rows = mysql_affected_rows(&mysql); } } }
Альтернатива (если известно, что данный запрос должен вернуть результирующий набор) состоит в замене вызова функции mysql_errno(&mysql) на проверку, равна ли 0 функция mysql_field_count(&mysql). Это может случиться, только если что-нибудь происходило не так.


MYSQL mysql;
mysql_init(&mysql); mysql_options(&mysql,MYSQL_OPT_COMPRESS,0); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, " Failed to connect to database: Error: %s\n", mysql_error(&mysql)); }
Вышеприведенный пример запрашивает клиента использовать сжатый клиент-серверный протокол и читать дополнительные опции из секции odbc в файле `my.cnf'.


MYSQL mysql;
mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, " Failed to connect to database: Error: %s\n", mysql_error(&mysql)); }
Используя функцию mysql_options(), библиотека MySQL будет читать секции [client] и [your_prog_name] в конфигурационном файле `my.cnf', что будет гарантировать нормальную работу данной программы, даже если MySQL будет установлен нестандартным образом.
Следует заметить, что во время соединения функция mysql_real_connect() устанавливает флаг reconnect (часть данной структуры MYSQL) в значение, равное 1. Этот флаг показывает, что в случае, если запрос не может быть выполнен из-за потери соединения, то следует попытаться восстановить соединение прежде, чем отказаться от него.


char query[1000],*end;
end = strmov(query,"INSERT INTO test_table values("); *end++ = '\''; end += mysql_real_escape_string(&mysql, end,"What's this",11); *end++ = '\''; *end++ = ','; *end++ = '\''; end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16); *end++ = '\''; *end++ = ')';
if (mysql_real_query(&mysql,query,(unsigned int) (end - query))) { fprintf(stderr, " Failed to insert row, Error: %s\n", mysql_error(&mysql)); }
Функция strmov(), использованная в этом примере, присутствует в библиотеке mysqlclient и работает подобно функции strcpy(), но возвращает указатель на концевой нуль первого параметра.


#include #include
static char *server_args[] = { "this_program", /* эта строка не используется */ "--datadir=.", "--key_buffer_size=32M" };
static char *server_groups[] = { "embedded", "server", "this_program_SERVER", (char *)NULL };
int main(void) { mysql_server_init(sizeof(server_args) / sizeof(char *), server_args, server_groups); /* Здесь используются любые функции MySQL API */ mysql_server_end(); return EXIT_SUCCESS; }

Содержание раздела