Интерфейс для С (C API)


Коротко о главном

API поддерживает богатый ассортимент функций, которые обеспечивают доступ к СУБД MySQL из программы пользователя, независимо от того, запущена ли она в локальной или на удаленной системе.

Подготовка

Вы должны подключить файл mysql.h в начале Вашей программы на C:

Вы также должны компоновать программу с математической (для шифрования) и mysqlclient библиотеками:

Включаемые файлы обычно размещены в /usr/include/mysql, а библиотеки могут быть найдены в /usr/lib/mysql.

Если Вы имеете утечку памяти в вашей программе-клиенте, Вы можете компилировать с опцией --with-debug=yes. Это заставит код клиента использовать пакет 'safe_malloc' в библиотеке клиентов MySQL. Вызовите TERMINATE(stdout) или my_end(1) в вашей прикладной программе-клиенте перед выходом, чтобы получить список всех утечек памяти. Детали - в файле mysys/safemalloc.c из дистрибутива MySQL.

Рассмотрим простой пример MySQL-клиента, который только выполнит SELECT и выведет все возвращенные строки в STDOUT. В нем использованы далеко не все функции С API, он должен только дать Вам представление о типичном виде программы-клиента.

#include <stdio.h> #include <stdlib.h> #include "mysql.h" MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; void exiterr(int exitcode) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(exitcode); } int main() { uint i = 0; if (!(mysql_connect(&mysql,"host","username","password"))) exiterr(1); if (mysql_select_db(&mysql,"payroll")) exiterr(2); if (mysql_query(&mysql,"SELECT name,rate FROM emp_master")) exiterr(3); if (!(res = mysql_store_result(&mysql))) exiterr(4); while((row = mysql_fetch_row(res))) { for (i=0 ; i < mysql_num_fields(res); i++) printf("%s\n",row[i]); } if (!mysql_eof(res)) exiterr(5); mysql_free_result(res); mysql_close(&mysql); }

Клиентские функции

MySQL API использует структуры данных MYSQL (определены в mysql.h) чтобы установить связь с СУБД. Вы можете устанавливать много соединений из одной программы-клиента, однако, каждое соединений должно быть связано с собственной отдельной структурой MYSQL.

После успешного запроса, если данные должны быть возвращены пользователю, набор результатов должен быть передан через функции mysql_use_result или через функцию mysql_store_result. Обе эти функции сохраняют набор результатов в структуре MYSQL_RES. Разница в том, что mysql_store_result передает весь набор результатов в память клиента, а mysql_use_result инструктирует клиента, чтобы он мог получить строку динамически с сервера с каждым обращением к mysql_fetch_row. Имейте в виду, что mysql_use_result занимает ресурсы сервера, и не должен использоваться для интерактивных прикладных программ, где действия пользователя часто непредсказуемы и могут привести к большим задержкам. Обратите внимание также, что Вы можете держать только одно соединение, которое использует mysql_user_result, открытым, и это должно быть последнее созданное соединение. По умолчанию процесс mysqld закроет соединение после тридцати секунд неактивности.

Данные, переданные из набора результатов с помощью mysql_fetch_row, будут помещены в структуру MYSQL_ROW, которая является просто массивом указателей на начало каждого поля.


mysql_affected_rows

СИНТАКСИС:

ОПИСАНИЕ:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

ПРИМЕР: mysql_query(&mysql,"INSERT INTO gl_transact(acctnbr, amount) VALUES(12345, 651.30)"); if (mysql_affected_rows(&mysql) < 0) fprintf(stderr, "Attempted to add duplicate primary key\n");

MySQL оптимизирован для случая удаления всех записей в таблице. Побочный эффект этой оптимизации - то, что MySQL возвратится, ноль для числа строк, на которые воздействовал в этой ситуации. Выполнение 'select count(*) from the_table' перед удалением всех записей даст Вам значение = на сколько строк воздействовала система, хотя это значение может изменяться между SELECT и DELETE. MySQL 3.20.X не поддерживает блокировку таблицы. Это исправлено в версии 3.21.X


mysql_close

СИНТАКСИС:

ОПИСАНИЕ:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


mysql_connect

СИНТАКСИС:

ОПИСАНИЕ:

Пытается установить соединение с сервером MySQL, работающем на компьютере host. Значение host может быть сетевым именем или IP адресом. Параметр user задает логин пользователя MySQL, параметр passwd задает пароль для user. ОБРАТИТЕ ВНИМАНИЕ: Не пытайтесь шифровать passwd перед вызовом mysql_connect. Шифрование выполняется автоматически клиентским API.

mysql_connect должен успешно завершиться до каких-либо действий с базой данных.

Вы можете опционально задать первый аргумент mysql_connect как (MYSQL*) 0. Это вынудит C API к автоматическому распределению памяти для структуры подключения и освобождению ее при завершении. Расплатой за это служит то, что Вы не сможете получать сообщения об ошибках из mysql_connect, когда используете эту опцию.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

ПРИМЕР:

MYSQL *mysql; if ((mysql = malloc(sizeof(MYSQL))) != NULL) { if (!(mysql_connect(mysql, "pr_server", "jqpublic", "mypasswd"))) { free(mysql); exit(1); } } free(mysql);

mysql_create_db

СИНТАКСИС:

ОПИСАНИЕ:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


mysql_data_seek

СИНТАКСИС:

ОПИСАНИЕ:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


mysql_drop_db

СИНТАКСИС:

ОПИСАНИЕ:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:


mysql_eof

СИНТАКСИС:

ОПИСАНИЕ:

Возвращает значение != 0, если последний вызов mysql_fetch_row не вернул ничего потому, что достигнут конец набора результатов.


mysql_error

СИНТАКСИС:

ОПИСАНИЕ:


mysql_fetch_field

СИНТАКСИС:

ОПИСАНИЕ:


mysql_fetch_lengths

СИНТАКСИС:

ОПИСАНИЕ:


mysql_fetch_row

СИНТАКСИС:

ОПИСАНИЕ:


mysql_field_seek

СИНТАКСИС:

ОПИСАНИЕ:


mysql_free_result

СИНТАКСИС:

ОПИСАНИЕ:


mysql_get_client_info

СИНТАКСИС:

ОПИСАНИЕ:

Эта функция просто возвращает строку с информацией о версии используемой в настоящее время клиентской библиотеки. Иногда полезно.


mysql_get_host_info

СИНТАКСИС:

ОПИСАНИЕ:


mysql_get_proto_info

СИНТАКСИС:

ОПИСАНИЕ:


mysql_get_server_info

СИНТАКСИС:

ОПИСАНИЕ:

Возвращает версию сервера.


mysql_insert_id

СИНТАКСИС:

ОПИСАНИЕ:


mysql_list_dbs

СИНТАКСИС:

ОПИСАНИЕ:


mysql_list_fields

СИНТАКСИС:

ОПИСАНИЕ:


mysql_list_processes

СИНТАКСИС:

ОПИСАНИЕ:


mysql_list_tables

СИНТАКСИС:

ОПИСАНИЕ:



mysql_num_fields

СИНТАКСИС:

ОПИСАНИЕ:

ПРИМЕР:

MYSQL mysql; MYSQL_RES *result; int fields; if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0) { result = mysql_store_result( &mysql ); if (result != NULL ) { fields = mysql_num_fields( result ); printf( "Retrieved %u fields\n", fields ); } else printf( "Query failed\n" ); } else abort();

См. также:


mysql_num_rows

СИНТАКСИС:

ОПИСАНИЕ:

ПРИМЕР:

MYSQL mysql; MYSQL_RES *result; int rows; if (mysql_query(&mysql, "SELECT * FROM emp_master") == 0) { result = mysql_store_result(&mysql ); if (result != NULL) { rows = mysql_num_rows(result); printf("Retrieved %u rows\n", rows); } else printf("Query failed\n"); } else abort();

См. также:


mysql_query

СИНТАКСИС:

ОПИСАНИЕ:


mysql_real_query

СИНТАКСИС:

ОПИСАНИЕ:


mysql_reload

СИНТАКСИС:

ОПИСАНИЕ:


mysql_select_db

СИНТАКСИС:

ОПИСАНИЕ:


mysql_shutdown

СИНТАКСИС:

ОПИСАНИЕ:


mysql_stat

СИНТАКСИС:

ОПИСАНИЕ:


mysql_store_result

СИНТАКСИС:

ОПИСАНИЕ:


mysql_use_result

СИНТАКСИС:

ОПИСАНИЕ:

В заключение хочется попросить Вас, если Вам понравилась эта страничка или пригодилась изложенная здесь информация, послать благодарность автору. Это поможет мне вести статистику того, скольким людям пригодилось хоть что-то из моих трудов.

Локальное оглавление.

На главную страничку.