Архив документации OpenNet.ru / Раздел "Базы данных, SQL" / Индекс

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

СИНТАКСИС:

ОПИСАНИЕ:

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

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

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


Архив документации на OpenNet.ru