| 
 | 
|  | 
| 
 | 
| эта страница доступна на следующих языках: English Castellano ChineseGB Deutsch Francais Nederlands Portugues Russian Turkce Polish | 
|   автор Özcan Güngör <ozcangungor(at)netscape.net> Об авторе: Я использую Linux с 1997 г. Свобода, настраиваемость и открытый код - это именно те качества, которые мне нравятся. Перевод на Русский: Pukhlyakov Kirill <kirill(at)linuxfocus.org> Содержание: | 
| MySQL C API  Резюме: В этой заметке я расскажу как использовать C API, поставляемый с MySQL. Чтобы понять о чем идет речь в заметке, необходимы следующие знания: 
 | 
MYSQL
Эта структура используется для подключения к базе.
typedef struct st_mysql {
  NET           net;            /* Communication parameters */
  gptr          connector_fd;   /* ConnectorFd for SSL */
  char          *host,*user,*passwd,*unix_socket,
                *server_version,*host_info,*info,*db;
  unsigned int  port,client_flag,server_capabilities;
  unsigned int  protocol_version;
  unsigned int  field_count;
  unsigned int  server_status;
  unsigned long thread_id;      /* Id for connection in server */
  my_ulonglong affected_rows;
  my_ulonglong insert_id;       /* id if insert on table with NEXTNR */
  my_ulonglong extra_info;              /* Used by mysqlshow */
  unsigned long packet_length;
  enum mysql_status status;
  MYSQL_FIELD   *fields;
  MEM_ROOT      field_alloc;
  my_bool       free_me;        /* If free in mysql_close */
  my_bool       reconnect;      /* set to 1 if automatic reconnect */
  struct st_mysql_options options;
  char          scramble_buff[9];
  struct charset_info_st *charset;
  unsigned int  server_language;
} MYSQL;
MYSQL_RES
Эта структура представляет результаты запроса, возвращает данные строками.
Возвращаемые данные называются result-set.
typedef struct st_mysql_res {
  my_ulonglong row_count;
  unsigned int  field_count, current_field;
  MYSQL_FIELD   *fields;
  MYSQL_DATA    *data;
  MYSQL_ROWS    *data_cursor;
  MEM_ROOT      field_alloc;
  MYSQL_ROW     row;            /* If unbuffered read */
  MYSQL_ROW     current_row;    /* buffer to current row */
  unsigned long *lengths;       /* column lengths of current row */
  MYSQL         *handle;        /* for unbuffered reads */
  my_bool       eof;            /* Used my mysql_fetch_row */
} MYSQL_RES;
MYSQL_ROW
Это еще одна структура для представления данных. Но вы не можете
использовать ее как строку, заканчивающуюся нулевым символом, потому, что строка может быть
двоичной и может содержать этот символ.
typedef struct st_mysql_field {
  char *name;                   /* Name of column */
  char *table;                  /* Table of column if column was a field */
  char *def;                    /* Default value (set by mysql_list_fields) */
  enum enum_field_types type;   /* Type of field. Se mysql_com.h for types */
  unsigned int length;          /* Width of column */
  unsigned int max_length;      /* Max width of selected set */
  unsigned int flags;           /* Div flags */
  unsigned int decimals;        /* Number of decimals in field */
} MYSQL_FIELD;
my_ulonglong
Этот тип используется для таких величин и функций как: количество
строк mysql_affected_rows(), mysql_num_rows(), и mysql_insert_id(). Диапазон этого типа:
от 0 до 1.84e19. В некоторых системах Вы не сможете вывести значение этого типа ( my_ulonglong ),
чтобы сделать это Вам придется превести это значение к типу unsigned long и использовать
формат %lu функции printf.
Например:
printf(Количество строк: %lu\n", (unsigned long) mysql_num_rows(result));
typedef unsigned long my_ulonglong;
Как Вы уже знаете, MySQL функции находятся в библиотеке mysqlclient. Поэтому, для компиляции приложений, взаимодействующих с MySQL, необходимо добавить опцию -lmysqlclient. Заголовочные файлы MySQL находятся в каталоге /usr/include/mysql ( впрочем зависит от вашего дистрибутива Linux ). Заголовок Вашего приложения должен выглядеть следующим образом:
#include <mysql/mysql.h>
Функции и переменные MySQL определены в этом заголовочном файле.
Далее, необходимо создать переменную для подключения к базе данных. Это достаточно просто и выглядит следующим образом:
MYSQL *mysql;
Перед непосредственным подключением к базе данных необходимо вызвать следующую функцию для инициализации переменной mysql:
mysql_init(MYSQL *mysql)
Затем вызывается функция
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql,
                                   const char *host,
                                   const char *user,
                                   const char *passwd,
                                   const char *db,
                                   unsigned int port,
                                   const char *unix_socket,
                                   unsigned int clientflag);
для подключения. host - имя компьютера с запущенным сервером MySQL, user - пользователь, которым мы хотим подключиться, passwd - пароль, db - база данных, к которой мы хотим подключиться, port - номер TCP/IP порта, unix_socket - тип соединения, clientflag - флаг, позволяющий MySQL работать подобно ODBC. В данной заметке для этого аргумента указываем значение 0. Эта функция возвращает 0 в случае успешного соединения.
Теперь мы можем подключиться к базе данных и выполнить запрос:
char *query;
Используя эту строку мы можем создать любой SQL запрос. Функция для выполнения запроса:
int STDCALL mysql_real_query(MYSQL *mysql,
                             const char *q,
                             unsigned int length);
mysql - переменная, которую мы создали, q - строка SQL запроса, length - длина этой строки.
Если запрос прошел успешно - функция возвращает 0.
После выполнения запроса нам потребуется переменная типа MYSQL_RES, чтобы мы могли использовать его результатыin. Эта переменная создается следующим образом:
MYSQL_RES *res;Затем
mysql_use_result(MYSQL *query)Эта функция используется для чтения результатов.
Также мы можем использовать запросы более простым способом, но для этого нам нужны другие функции. Первая из них:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);Эта функция преобразует результат в строки. Как вы заметили, функция возвращает результат в формате переменной типа MYSQL_ROW. Эта переменная создается следующим образом:
MYSQL_ROW row;Как мы уже сказали переменная row это массив строк. Это значит, что row[0] первая колонка первой строки, row[1] - вторая колонка первой строки... Функция mysql_fetch_row возвращает следующую строку результата, если данных больше нет - возвращается отрицательное значение. После окончания работы мы должны закрыть соединение:
mysql_close(MYSQL *mysql)
unsigned int STDCALL mysql_num_fields(MYSQL *mysql);
Чтобы узнать количество строк результата запроса используйте:
my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
Эта функция возвращает количество строк при использовании SQL запросов INSERT, DELETE, UPDATE. Обратите внимание, что возвращаемый резутьтат имеет тип my_ulonglong.И наконец пример кода:
#include <mysql/mysql.h>
#include <stdio.h>
void main(){
   MYSQL *mysql;
   MYSQL_RES *res;
   MYSQL_ROW row;
   char *query;
   int t,r;
   mysql_init(mysql);
   if (!mysql_real_connect(mysql,"localhost","mysql",
        "mysql","deneme",0,NULL,0))
   {
       printf( "Error connecting to database: %s\n",mysql_error(mysql));
   }
   else printf("Connected...\n");
   query="select * from Deneme";
   t=mysql_real_query(mysql,query,(unsigned int) strlen(query));
   if (t)
   {
      printf("Error making query: %s\n",
              mysql_error(mysql));
   }
   else printf("Query made...\n");
   res=mysql_use_result(mysql);
   for(r=0;r<=mysql_field_count(mysql);r++){
           row=mysql_fetch_row(res);
           if(row<0) break;
           for(t=0;t<mysql_num_fields(res);t++){
                   printf("%s ",row[t]);
           }
           printf("\n");
   }
   mysql_close(mysql);
}
 
| 
 | 
| Webpages maintained by the LinuxFocus Editor team © Özcan Güngör, FDL LinuxFocus.org | Translation information: 
 | 
2003-09-02, generated by lfparser version 2.42