您的位置:首页 > 博客中心 > 数据库 >

The MySQL C API 编程实例

时间:2022-03-10 17:57

    在这篇文章里,我们将学会怎么使用MySQL 的C APIs(Application Programming Interfaces 编程接口)。为了非常好地了解这篇文章,您须要具备下面前提知识:

  • 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;

 

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;

 

typedef char **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;

#include <mysql.h>

MYSQL mysql;

mysql_init(&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是MySQLserver的主机名,user是登录的username,passwd是登录password,db是要连接的数据库,port是MySQLserver的TCP/IP端口,unix_socket是连接类型,clientflag是MySQL执行成ODBC数据库的标记。在这篇文章其中该标记设成0,连接寻建立后,这个函数返回0。

char *query;

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned int length);

 

mysql是我们前面用过的变量,q是SQL查询语句,length是这个查询语句的长度。假设查询成功,函数返回0。

MYSQL_RES *res;

res = mysql_store_result(&mysql);


    对client而言,有两种方法处理结果集合。一种方法是通过调用mysql_store_result()立马检索所有结果。该函数从server获得查询返回的所有行,并将他们存储在client。另外一种方法是对客户通过调用mysql_use_result()初始化一个一行一行地结果集合的检索。该函数初始化检索,可是实际上不从server获得不论什么行。

在两种情况中,你通过mysql_fetch_row()存取行。用mysql_store_result()、mysql_fetch_row()储存取已经从server被取出的行。用mysql_use_result()、mysql_fetch_row()实际上从server检索行。调用mysql_fetch_lengths()可获得关于每行中数据值尺寸的信息。


    在你用完一个结果集合以后,调用mysql_free_result()释放由它使用的内存。

两种检索机制是互补的。客户程序应该选择最适合他们的要求的途径。在实践中,客户通常更愿意使用mysql_store_result()。

该函数读出查询结果。

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

MYSQL_ROW row = mysql_fetch_row(res)


    如前所解释的,变量row是一个字符串数组。也就是说,row[0]是数组的第一个值,row[1]是数组的第二个值...当我们用mysql_fetch_row的时候,接着变量row会取得结果的下一组的数据。当到了结果的尾部,该函数返回一负值。

void mysql_free_result(MYSQL_RES *result)

mysql_close(&mysql);

Create Databse test

05 Nov 2004
*/
 
#include <mysql.h>
#include <stdio.h>

int main(){
 MYSQL mysql;     // need a instance to init
 MYSQL_RES *res;
 MYSQL_ROW row;
 char *query;
 int t,r;
 // connect the database 
 mysql_init(&mysql);
 if (!mysql_real_connect(&mysql,"localhost", "mmim", "mmim", "test",0,NULL,0))
 {
     printf( "Error connecting to database: %s/n",mysql_error(&mysql));
 }
 else printf("Connected.../n");

 // get the result from the executing select query
 query = "select * from t1";
  
 t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
 if (t)
 {
    printf("Error making query: %s/n",
      mysql_error(&mysql));
 }
 else printf("[%s] made.../n", query); 
 res = mysql_store_result(&mysql); 
 while(row = mysql_fetch_row(res))
 {
  for(t=0;t<mysql_num_fields(res);t++)
  {
   printf("%s ",row[t]);
  }
  printf("/n");
 }
 
 printf("mysql_free_result.../n");
 mysql_free_result(res);     //free result after you get the result
 
 sleep(1);    
 
 // execute the insert query
 query = "insert into t1(id, name) values(3, ‘kunp‘)";
 t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
 if (t)
 {
    printf("Error making query: %s/n",
      mysql_error(&mysql));
 }
 else printf("[%s] made.../n", query); 
  
    mysql_close(&mysql);
  
   return 0;
}

gcc testsql.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient

 

 

The MySQL C API 编程实例,布布扣,bubuko.com

相关推荐

电脑软件

热门排行

今日推荐

热门手游