本文介绍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开发包
sudo apt-get install libmysqlclient-dev
Ubuntu Package查询地址(输入关键词查询到最新的package名字,比如libmysqlclient,然后装最新的版本):
三、如何调用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 |
06 | MYSQL DbObj; //handle |
07 | MYSQL_RES *pRes; //results |
08 | MYSQL_ROW sqlrow; //rows |
09 |
10 | int 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安装与开发包配置:百度空间
更多文章:
Linux下想要测试mysql和memcached的性能,因为是服务器只能通过终端连接,所以考虑用C语言写测试代码。于是研究了把C怎么连接MySQL以及增删改查的代码。安装mysql-client或者编译源码安装mysql后,会有支持C语言写客户端的头文件和库文件,但是目录可能不一样,mysql源码安装见 http://asyty.iteye.com/blog/1442503
从网上找了类似的代码改改后如下
连接数据库
- #include <stdlib.h>
- #include <stdio.h>
- #include <mysql.h>
- int main() {
- MYSQL *conn_ptr;
- conn_ptr = mysql_init(NULL);
- if (!conn_ptr) {
- printf("mysql_init failed\n");
- return EXIT_FAILURE;
- }
- conn_ptr = mysql_real_connect(conn_ptr, "localhost", "root", "123456", "test", 0, NULL, 0);
- //root 为用户名 123456为密码 test为要连接的database
- if (conn_ptr) {
- printf("Connection success\n");
- } else {
- printf("Connection failed\n");
- }
- mysql_close(conn_ptr);
- return EXIT_SUCCESS;
- }
通过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文件
查询代码
- #include <stdio.h>
- #include <stdlib.h>
- #include <mysql.h>
- int main() {
- MYSQL *conn_ptr;
- MYSQL_RES *res_ptr;
- MYSQL_ROW sqlrow;
- MYSQL_FIELD *fd;
- int res, i, j;
- conn_ptr = mysql_init(NULL);
- if (!conn_ptr) {
- return EXIT_FAILURE;
- }
- conn_ptr = mysql_real_connect(conn_ptr, "localhost", "root", "123456", "test", 0, NULL, 0);
- if (conn_ptr) {
- res = mysql_query(conn_ptr, "select name,age from user"); //查询语句
- if (res) {
- printf("SELECT error:%s\n",mysql_error(conn_ptr));
- } else {
- res_ptr = mysql_store_result(conn_ptr); //取出结果集
- if(res_ptr) {
- printf("%lu Rows\n",(unsigned long)mysql_num_rows(res_ptr));
- j = mysql_num_fields(res_ptr);
- while((sqlrow = mysql_fetch_row(res_ptr))) { //依次取出记录
- for(i = 0; i < j; i++)
- printf("%s\t", sqlrow[i]); //输出
- printf("\n");
- }
- if (mysql_errno(conn_ptr)) {
- fprintf(stderr,"Retrive error:s\n",mysql_error(conn_ptr));
- }
- }
- mysql_free_result(res_ptr);
- }
- } else {
- printf("Connection failed\n");
- }
- mysql_close(conn_ptr);
- return EXIT_SUCCESS;
- }
插入更新及删除
- #include <stdlib.h>
- #include <stdio.h>
- #include <mysql.h>
- int main() {
- MYSQL *conn_ptr;
- int res;
- conn_ptr = mysql_init(NULL);
- if (!conn_ptr) {
- printf("mysql_init failed\n");
- return EXIT_FAILURE;
- }
- conn_ptr = mysql_real_connect(conn_ptr, "localhost", "root", "123456", "test", 0, NULL, 0);
- if (conn_ptr) {
- res = mysql_query(conn_ptr, "insert into user values(null,'Ann',5)"); //可以把insert语句替换成delete或者update语句,都一样的
- // res = mysql_query(conn_ptr, "delete from user where name = 'Ann' and age < 10");
- if (!res) { //输出受影响的行数
- printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(conn_ptr));
- } else { //打印出错误代码及详细信息
- fprintf(stderr, "Insert error %d: %sn",mysql_errno(conn_ptr),mysql_error(conn_ptr));
- }
- } else {
- printf("Connection failed\n");
- }
- mysql_close(conn_ptr);
- return EXIT_SUCCESS;
- }