首页 > 代码库 > LINUX

LINUX

Linux C语言连接MySQL 增删改查操作

 

Linux下想要测试mysql和memcached的性能,因为是服务器只能通过终端连接,所以考虑用C语言写测试代码。于是研究了把C怎么连接MySQL以及增删改查的代码。安装mysql-client或者编译源码安装mysql后,会有支持C语言写客户端的头文件和库文件,但是目录可能不一样,mysql源码安装见 http://asyty.iteye.com/blog/1442503

从网上找了类似的代码改改后如下

 

连接数据库

 

C代码  技术分享
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <mysql.h>  
  4. int main() {  
  5.     MYSQL *conn_ptr;  
  6.   
  7.     conn_ptr = mysql_init(NULL);  
  8.     if (!conn_ptr) {  
  9.         printf("mysql_init failed\n");  
  10.         return EXIT_FAILURE;  
  11.     }  
  12.     conn_ptr = mysql_real_connect(conn_ptr, "localhost", "root", "123456", "test", 0, NULL, 0);  
  13.     //root 为用户名 123456为密码 test为要连接的database  
  14.   
  15.     if (conn_ptr) {  
  16.         printf("Connection success\n");  
  17.     } else {  
  18.         printf("Connection failed\n");  
  19.     }  
  20.     mysql_close(conn_ptr);  
  21.     return EXIT_SUCCESS;  
  22. }  

 

 通过gcc编译(我的mysql源码安装目录为 /usr/local/mysql)

 

gcc -o connect -g connect.c  -I /usr/local/mysql/include/ -L /usr/local/mysql/lib/ -l mysqlclient

 

参数说明:-I(大写的i) 表示要连接的头文件目录,因为使用了<mysql.h> ,-L表示要连接的库文件目录 -l(小写的L) 表示要连接的具体的库名称,在/usr/local/mysql/lib/ 下,有叫做libmysqlclient.so的库,指定具体的库的名字时,默认去掉头尾的lib和.so直接使用中间的mysqlclient

如果不用-I -L ,可能导致找不到头文件 或者 函数未定义的错误

 

如果出现错误error while loading shared libraries,那是因为.so没有被系统载入,解决办法如下

vi /etc/ld.so.conf  // 打开ld.so.conf文件,增加.so文件的路径,比如/usr/local/mysql/lib/

ldconfig //重新加载.so文件

 

 

查询代码  

C代码  技术分享
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <mysql.h>  
  4. int main() {  
  5.     MYSQL *conn_ptr;  
  6.     MYSQL_RES *res_ptr;  
  7.     MYSQL_ROW sqlrow;  
  8.     MYSQL_FIELD *fd;  
  9.     int res, i, j;  
  10.   
  11.     conn_ptr = mysql_init(NULL);  
  12.     if (!conn_ptr) {  
  13.         return EXIT_FAILURE;  
  14.     }  
  15.     conn_ptr = mysql_real_connect(conn_ptr, "localhost", "root", "123456", "test", 0, NULL, 0);  
  16.     if (conn_ptr) {  
  17.         res = mysql_query(conn_ptr, "select name,age from user"); //查询语句  
  18.         if (res) {         
  19.             printf("SELECT error:%s\n",mysql_error(conn_ptr));     
  20.         } else {        
  21.             res_ptr = mysql_store_result(conn_ptr);             //取出结果集  
  22.             if(res_ptr) {               
  23.                 printf("%lu Rows\n",(unsigned long)mysql_num_rows(res_ptr));   
  24.                 j = mysql_num_fields(res_ptr);          
  25.                 while((sqlrow = mysql_fetch_row(res_ptr)))  {   //依次取出记录  
  26.                     for(i = 0; i < j; i++)         
  27.                         printf("%s\t", sqlrow[i]);              //输出  
  28.                     printf("\n");          
  29.                 }              
  30.                 if (mysql_errno(conn_ptr)) {                      
  31.                     fprintf(stderr,"Retrive error:s\n",mysql_error(conn_ptr));               
  32.                 }        
  33.             }        
  34.             mysql_free_result(res_ptr);        
  35.         }  
  36.     } else {  
  37.         printf("Connection failed\n");  
  38.     }  
  39.     mysql_close(conn_ptr);  
  40.     return EXIT_SUCCESS;  
  41. }  

 

 

插入更新及删除 

 

C代码  技术分享
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <mysql.h>  
  4. int main() {  
  5.     MYSQL *conn_ptr;  
  6.     int res;  
  7.   
  8.     conn_ptr = mysql_init(NULL);  
  9.     if (!conn_ptr) {  
  10.         printf("mysql_init failed\n");  
  11.         return EXIT_FAILURE;  
  12.     }  
  13.     conn_ptr = mysql_real_connect(conn_ptr, "localhost", "root", "123456", "test", 0, NULL, 0);  
  14.     if (conn_ptr) {  
  15.         res = mysql_query(conn_ptr, "insert into user values(null,‘Ann‘,5)");   //可以把insert语句替换成delete或者update语句,都一样的  
  16. //      res = mysql_query(conn_ptr, "delete from user where name = ‘Ann‘ and age < 10");  
  17.         if (!res) {     //输出受影响的行数  
  18.             printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(conn_ptr));   
  19.         }  else {       //打印出错误代码及详细信息  
  20.             fprintf(stderr, "Insert error %d: %sn",mysql_errno(conn_ptr),mysql_error(conn_ptr));  
  21.         }  
  22.     } else {  
  23.         printf("Connection failed\n");  
  24.     }  
  25.     mysql_close(conn_ptr);  
  26.     return EXIT_SUCCESS;  
  27. }  

 

 

用C语言操作MySQL数据库 

参考MYSQL的帮助文档整理

这里归纳了C API可使用的函数,并在下一节详细介绍了它们。请参见25.2.3节,“C API函数描述”。

函数

描述

mysql_affected_rows()

返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。

mysql_autocommit()

切换 autocommit模式,ON/OFF

mysql_change_user()

更改打开连接上的用户和数据库。

mysql_charset_name()

返回用于连接的默认字符集的名称。

mysql_close()

关闭服务器连接。

mysql_commit()

提交事务。

mysql_connect()

连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。

mysql_create_db()

创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。

mysql_data_seek()

在查询结果集中查找属性行编号。

mysql_debug()

用给定的字符串执行DBUG_PUSH。

mysql_drop_db()

撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。

mysql_dump_debug_info()

让服务器将调试信息写入日志。

mysql_eof()

确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。

mysql_errno()

返回上次调用的MySQL函数的错误编号。

mysql_error()

返回上次调用的MySQL函数的错误消息。

mysql_escape_string()

为了用在SQL语句中,对特殊字符进行转义处理。

mysql_fetch_field()

返回下一个表字段的类型。

mysql_fetch_field_direct()

给定字段编号,返回表字段的类型。

mysql_fetch_fields()

返回所有字段结构的数组。

mysql_fetch_lengths()

返回当前行中所有列的长度。

mysql_fetch_row()

从结果集中获取下一行

mysql_field_seek()

将列光标置于指定的列。

mysql_field_count()

返回上次执行语句的结果列的数目。

mysql_field_tell()

返回上次mysql_fetch_field()所使用字段光标的位置。

mysql_free_result()

释放结果集使用的内存。

mysql_get_client_info()

以字符串形式返回客户端版本信息。

mysql_get_client_version()

以整数形式返回客户端版本信息。

mysql_get_host_info()

返回描述连接的字符串。

mysql_get_server_version()

以整数形式返回服务器的版本号。

mysql_get_proto_info()

返回连接所使用的协议版本。

mysql_get_server_info()

返回服务器的版本号。

mysql_info()

返回关于最近所执行查询的信息。

mysql_init()

获取或初始化MYSQL结构。

mysql_insert_id()

返回上一个查询为AUTO_INCREMENT列生成的ID。

mysql_kill()

杀死给定的线程。

mysql_library_end()

最终确定MySQL C API库。

mysql_library_init()

初始化MySQL C API库。

mysql_list_dbs()

返回与简单正则表达式匹配的数据库名称。

mysql_list_fields()

返回与简单正则表达式匹配的字段名称。

mysql_list_processes()

返回当前服务器线程的列表。

mysql_list_tables()

返回与简单正则表达式匹配的表名。

mysql_more_results()

检查是否还存在其他结果。

mysql_next_result()

在多语句执行过程中返回/初始化下一个结果。

mysql_num_fields()

返回结果集中的列数。

mysql_num_rows()

返回结果集中的行数。

mysql_options()

为mysql_connect()设置连接选项。

mysql_ping()

检查与服务器的连接是否工作,如有必要重新连接。

mysql_query()

执行指定为“以Null终结的字符串”的SQL查询。

mysql_real_connect()

连接到MySQL服务器。

mysql_real_escape_string()

考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。

mysql_real_query()

执行指定为计数字符串的SQL查询。

mysql_refresh()

刷新或复位表和高速缓冲。

mysql_reload()

通知服务器再次加载授权表。

mysql_rollback()

回滚事务。

mysql_row_seek()

使用从mysql_row_tell()返回的值,查找结果集中的行偏移。

mysql_row_tell()

返回行光标位置。

mysql_select_db()

选择数据库。

mysql_server_end()

最终确定嵌入式服务器库。

mysql_server_init()

初始化嵌入式服务器库。

mysql_set_server_option()

为连接设置选项(如多语句)。

mysql_sqlstate()

返回关于上一个错误的SQLSTATE错误代码。

mysql_shutdown()

关闭数据库服务器。

mysql_stat()

以字符串形式返回服务器状态。

mysql_store_result()

检索完整的结果集至客户端。

mysql_thread_id()

返回当前线程ID。

mysql_thread_safe()

如果客户端已编译为线程安全的,返回1。

mysql_use_result()

初始化逐行的结果集检索。

mysql_warning_count()

返回上一个SQL语句的告警数。

与MySQL交互时,应用程序应使用该一般性原则:

1.    通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。

2.    通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。

3.    发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。

4.    通过调用mysql_close(),关闭与MySQL服务器的连接。

5.    通过调用mysql_library_end(),结束MySQL库的使用。

介绍常用到的MYSQL相关的C变量类型。这些类型在我们后面定义变量的时候会用到

1、MYSQL

       要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接

示例:

MYSQL mysql;                    #创建MYSQL实例

mysql_init(&mysql);             #初始化开始进行连接

2、MYSQL_RES

这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”。 从数据库读取数据,最后就是从MYSQL_RES中读取数据。

PS:类似于JAVA里面的ResultSet变量一样,将结果集存入到此变量中再从它里面去读数据。

3、MYSQL_ROW

这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。行通过调用mysql_fetch_row()获得

4、MYSQL_FIELD

你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。这个结构包含字段信息,例如字段名、类型和大小。

PS:此变量定义的是列的相关属性问题!

 

 

 

 

示例一:实现遍历查询select * from table-name 操作

#include "windows.h"

#include "mysql.h"

#pragma comment(lib,"libmySQL.lib")

int main()

{

      MYSQL mysql;     //mysql连接

      MYSQL_RES *res; //这个结构代表返回行的一个查询结果集

      MYSQL_ROW row; //一个行数据的类型安全(type-safe)的表示

      char *query;   //查询语句     

      int t,r;

      mysql_init(&mysql);

         if (!mysql_real_connect(&mysql,"localhost", "root", "123", "test",3306,NULL,0))

      {

 

         printf( "Error connecting to database: %s",mysql_error(&mysql));

 

      } else

         printf("Connected...");

         query="SET CHARACTER SET utf8"; //设置编码

      t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));

      if(t)

      {

           printf("编码设置失败");

      }

         query=" select * from a ";

      t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));

      if(t)

      {

          printf("执行查询时出现异常: %s",mysql_error(&mysql));

      }else

          printf("[%s] 构建成功",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("%s",row[1]);         表示查询的第几个字段的!也还可以遍历全部字段信息

          printf("\n");

 

      }

      mysql_free_result(res);

mysql_close(&mysql);

         return 0;

}

 

示例二:执行插入、更新、删除操作

#include "windows.h"

#include "mysql.h"

#pragma comment(lib,"libmySQL.lib")

int main()

{

      MYSQL mysql;     //mysql连接

      MYSQL_RES *res; //这个结构代表返回行的一个查询结果集

      MYSQL_ROW row; //一个行数据的类型安全(type-safe)的表示

      char *query;   //查询语句     

      int t,r;

      mysql_init(&mysql);

         if (!mysql_real_connect(&mysql,"localhost", "root", "123", "test",3306,NULL,0))

      {

 

         printf( "Error connecting to database: %s",mysql_error(&mysql));

 

      } else

         printf("Connected...");

         query="SET CHARACTER SET utf8"; //设置编码

      t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));

      if(t)

      {

           printf("编码设置失败");

      }

         query="insert into a(name,age) values(‘w‘,9)";

      t=mysql_real_query(&mysql,query,(unsigned int)strlen(query));

      if(t)

      {

          printf("执行查询时出现异常: %s",mysql_error(&mysql));

      }else

          printf("[%s] 构建成功",query);

      mysql_close(&mysql);

      return 0;

}

LINUX