Перейти к оглавлению

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


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

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

Подготовка

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

< UL>< TT>#include "mysql.h"< /TT>< /UL>

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

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

Если Вы имеете утечку памяти в вашей программе-клиенте, Вы можете компилировать с опцией < TT>--with-debug=yes< /TT>. Это заставит код клиента использовать пакет '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.

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

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


mysql_affected_rows

СИНТАКСИС: < UL>

< TT>int mysql_affected_rows(MYSQL *mysql)< /TT>< /UL>

ОПИСАНИЕ: < UL>Возвращает число строк, на которые воздействует последний UPDATE, DELETE или INSERT.< /UL>

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

  • Целое число > 0 показывает число измененных строк.
  • Ноль, если никакие записи не соответствовали предложению WHERE в UPDATE или DELETE.
  • -1, если запрос возвратил ошибку, например, была сделана попытка добавить двойной первичный ключ в течение одного INSERT.
  • ПРИМЕР:

    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

    СИНТАКСИС:

    ОПИСАНИЕ:

    Перейти к оглавлению
    Hosted by uCoz