数据库 mysql MySQL API 使用详解 苏丙榅 2022-03-11 2024-07-27 连接数据库的步骤 众所周知,MySQL数据库是一个典型的C/S结构,即:客户端和服务器端。如果我们部署好了MySQL服务器,想要在客户端访问服务器端的数据,在编写程序的时候就可以通过官方提供的C语言的API来实现。
在程序中连接MySql服务器,主要分为已经几个步骤:
初始化连接环境
连接mysql的服务器,需要提供如下连接数据:
服务器的IP地址 
服务器监听的端口(默认端口是3306) 
连接服务器使用的用户名(默认是 root),和这个用户对应的密码 
要操作的数据库的名字 
 
连接已经建立, 后续操作就是对数据库数据的添删查改
如果要进行数据 添加/ 删除/ 更新,需要进行事务的处理
数据库的读操作 -> 查询  -> 得到结果集
遍历结果集 -> 得到了要查询的数据
释放资源
 
MySQL C API 对于以上的操作步骤,在MySQL提供的API中都有对应的操作函数,下面,为大家介绍一下这些API函数的使用。
初始化连接环境 1 2 3 4 MYSQL *mysql_init (MYSQL *mysql)  ; 
连接mysql服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17   MYSQL *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  long  client_flag) ; 
执行sql语句 1 2 3 4 5 6 7 8 int  mysql_query (MYSQL *mysql, const  char  *query) ;参数:     - mysql: mysql_real_connect() 的返回值     - query: 一个可以执行的sql语句, 结尾的位置不需要加 ; 返回值:      - 如果查询成功,返回0 。如果是查询, 结果集在mysql 对象中     - 如果出现错误,返回非0 值。  
获取结果集 1 2 3 4 5 MYSQL_RES *mysql_store_result (MYSQL *mysql) ; 
得到结果集的列数 1 2 3 4 unsigned  int  mysql_num_fields (MYSQL_RES *result) 
获取表头 -> 列名(字段名) 1 2 3 4 5 MYSQL_FIELD *mysql_fetch_fields (MYSQL_RES *result) ; 
返回值MYSQL_FIELD对应的是一个结构体,在mysql.h中定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 typedef  struct  st_mysql_field  {  char  *name;                    char  *org_name;                char  *table;                   char  *org_table;               char  *db;                      char  *catalog;                 char  *def;                     unsigned  long  length;          unsigned  long  max_length;      unsigned  int  name_length;   unsigned  int  org_name_length;                                                                                           unsigned  int  table_length;   unsigned  int  org_table_length;   unsigned  int  db_length;   unsigned  int  catalog_length;   unsigned  int  def_length;   unsigned  int  flags;            unsigned  int  decimals;         unsigned  int  charsetnr;        enum  enum_field_types  type ;   void  *extension; } MYSQL_FIELD; 
函数的使用举例:
1 2 3 4 5 6 7 8 9 MYSQL_FIELD* fields = mysql_fetch_fields(res); int  num = mysql_num_fields(res);for (int  i=0 ; i<num; ++i){     printf ("当前列的名字: %s\n" , fields[i].name); } 
得到结果集中字段的长度 1 2 3 4 5 6 7 8 9 10 unsigned  long  *mysql_fetch_lengths (MYSQL_RES *result) ;参数:      - result: 通过查询得到的结果集 返回值:     - 无符号长整数的数组表示各列的大小。如果出现错误,返回NULL 。 
示例程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 MYSQL_ROW row; unsigned  long  *lengths;unsigned  int  num_fields;  row = mysql_fetch_row(result); if  (row){     num_fields = mysql_num_fields(result);     lengths = mysql_fetch_lengths(result);     for (int  i = 0 ; i < num_fields; i++)     {          printf ("Column %u is %lu bytes in length.\n" , i, lengths[i]);     } } 
遍历结果集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 typedef  char ** MYSQL_ROW;MYSQL_ROW mysql_fetch_row (MYSQL_RES *result) ; 参数:      - result: 通过查询得到的结果集 返回值:      - 成功: 得到了当前记录中每个字段的值     - 失败: NULL , 说明数据已经读完了 
资源回收 1 2 3 4 5 void  mysql_free_result (MYSQL_RES *result) ;void  mysql_close (MYSQL *mysql) ;
字符编码 1 2 3 4 5 6 7 8 const  char  *mysql_character_set_name (MYSQL *mysql)  int  mysql_set_character_set (MYSQL *mysql, char  *csname) ;
事务操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 my_bool mysql_autocommit (MYSQL *mysql, my_bool mode)   参数:     如果模式为“1”,启用autocommit模式;如果模式为“0”,禁止autocommit模式。 返回值     如果成功,返回0,如果出现错误,返回非0值。 my_bool mysql_commit (MYSQL *mysql) ; 返回值: 成功: 0 , 失败: 非0       my_bool mysql_rollback (MYSQL *mysql)   返回值: 成功: 0, 失败: 非0 
打印错误信息 1 2 3 4 const  char  *mysql_error (MYSQL *mysql) ;unsigned  int  mysql_errno (MYSQL *mysql) ;
实例代码 
需要的头文件
以上API对应的MySQL动态库
Windows:libmysql.dll
Linux:libmysqlclient.so
 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 #include  <stdio.h>  #include  <mysql.h>  int  main () {          MYSQL* mysql = mysql_init(NULL );     if (mysql == NULL )\     {         printf ("mysql_init() error\n" );         return  -1 ;     }          mysql = mysql_real_connect(mysql, "localhost" , "root" , "root" ,                                 "scott" , 0 , NULL , 0 );     if (mysql == NULL )     {         printf ("mysql_real_connect() error\n" );         return  -1 ;     }     printf ("mysql api使用的默认编码: %s\n" , mysql_character_set_name(mysql));          mysql_set_character_set(mysql, "utf8" );     printf ("mysql api使用的修改之后的编码: %s\n" , mysql_character_set_name(mysql));     printf ("恭喜, 连接数据库服务器成功了...\n" );               const  char * sql = "select * from dept" ;          int  ret = mysql_query(mysql, sql);     if (ret != 0 )     {         printf ("mysql_query() a失败了, 原因: %s\n" , mysql_error(mysql));         return  -1 ;     }          MYSQL_RES* res = mysql_store_result(mysql);     if (res == NULL )     {         printf ("mysql_store_result() 失败了, 原因: %s\n" , mysql_error(mysql));         return  -1 ;     }          int  num = mysql_num_fields(res);          MYSQL_FIELD * fields = mysql_fetch_fields(res);     for (int  i=0 ; i<num; ++i)     {         printf ("%s\t\t" , fields[i].name);     }     printf ("\n" );          MYSQL_ROW row;     while ( (row = mysql_fetch_row(res)) != NULL )     {                  for (int  i=0 ; i<num; ++i)         {             printf ("%s\t\t" , row[i]);         }         printf ("\n" );     }          mysql_free_result(res);                    mysql_autocommit(mysql, 0 );      int  ret1 = mysql_query(mysql, "insert into dept values(61, '海军', '圣地玛丽乔亚')" );     int  ret2 = mysql_query(mysql, "insert into dept values(62, '七武海', '世界各地')" );     int  ret3 = mysql_query(mysql, "insert into dept values(63, '四皇', '新世界')" );     printf ("ret1 = %d, ret2 = %d, ret3 = %d\n" , ret1, ret2, ret3);     if (ret1==0  && ret2==0  && ret3==0 )     {                  mysql_commit(mysql);     }     else      {         mysql_rollback(mysql);     }          mysql_close(mysql);        return  0 ; } 
更多关于MySQL API 的应用:数据库连接池