Интерфейс для С (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

СИНТАКСИС:

ОПИСАНИЕ:

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

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

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


Banner.Novgorod.Ru