Linux下C/C++编程访问MYSQL

本文介绍Linux下使用C/C++编程访问MYSQL数据库方法,归纳以下方法其实也很简单:安装MYSQL、包含mysql.h头文件、写main函数即可,本文测试系统为Ubuntu11.10,其它L家族系统方法类似。

一、安装mysql数据库

sudo apt-get install mysql-server mysql-client

自动安装最新版本mysql(包括server和client端,区别基本可理解为mysql-server主要提供MYSQL系统服务,mysql-client主要提供MYSQL访问终端,也可只装mysql-server),安装完成后,MySQL服务会自动启动。

检查 MySQL 服务运行状态:

sudo netstat -tap | grep mysql

手动启动mysql:

sudo /etc/init.d/mysql restart

停止mysql:

sudo /etc/init.d/mysql stop

更多:

MySQL无法启动、无法停止解决方法

如何给MySql创建连接用户并授权

二、安装mysql开发包

sudo apt-get install libmysqlclient-dev

Ubuntu Package查询地址(输入关键词查询到最新的package名字,比如libmysqlclient,然后装最新的版本):

http://packages.ubuntu.com/

三、如何调用MYSQL库文件

加入头文件: #include <mysql/mysql.h>

四、编译方法

gcc -o test test.c -lmysqlclient

或(c++程序)

g++ -o test test.cpp -lmysqlclient

还是找不到mysql.h?添加参数-I/usr/include/mysql/看看(示例如下),假设mysql.h在该目录下。

gcc -o test test.c -lmysqlclient -I/usr/include/mysql/

执行:

./test

五、实例代码

01#include "mysql.h"
02#include "stdio.h"
03#include <string.h>
04#include <algorithm>
05 
06MYSQL DbObj;//handle
07MYSQL_RES *pRes;//results
08MYSQL_ROW sqlrow;//rows
09 
10int main()
11{
12    char tmp[255];
13    mysql_init(&DbObj);
14 
15    if (!mysql_real_connect(&DbObj, host,usr, pass, db, 0, NULL, 0))
16    {
17            return 0;
18    }
19 
20    sprintf(tmp,"select * from usertb where name=\'abc\' and pwd=\'123456\'");
21    int res=mysql_query(&DbObj,tmp);
22    pRes = mysql_use_result(&DbObj);
23    if((sqlrow=mysql_fetch_row(pRes))!=NULL)
24    {
25        mysql_free_result(pRes);
26        printf("OK.\n");
27    }
28    else
29    {
30        printf("Failed.\n");
31    }
32 
33    mysql_close(&DbObj);
34    return 0;
35}

参考资料:

MYSQL安装指南:Ubuntu中文网

ubuntu下mysql安装与开发包配置:百度空间

更多文章:

修改MySQL连接数与MySQL连接数超限原因分析

MySQL数据类型及范围用法一览表

MySQL无法启动、无法停止解决方法

如何给MySql创建连接用户并授权

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. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值