Linux下C++连MySQL数据库
1.查看本地有没有安装mysql,命令就是mysql,如果有这个命令就表示安装了mysql数据库软件。如果没有就自行安装。
MySQL-server-4.0.16-0.i386.rpm
MySQL-client-4.0.16-0.i386.rpm
2.查看本地有没有安装mysql的开发包。命令是 `mysql_config --cflags --libs` 如果有安装就会有一串编译选项和连接库。如果没有就自行安装 mysql-devel-*****的rpm包 后面是版本号。mysql开发包提供了基本操作接口。安装后头文件在/usr/include/mysql 而动态库在 /usr/lib/mysql 上。
3.创建一个用于练习的数据库test.进入mysql> 然后依次输入:
mysql>create database test;
mysql>use test; //切换到test数据库中
mysql> create table test(name varchar(255),num int(10) ); //创建一个叫test的表
mysql>show create table test; //显示刚才创建的表信息
mysql> select * from test; //查询test表中数据
mysql>quit
4.编写一个c++程序,代码如下:
1 #include <stdio.h> 2 #include <mysql.h> 3 4 int main(int argc,char *argv[]) 5 { 6 MYSQL conn; 7 int res; 8 mysql_init(&conn); 9 if(mysql_real_connect(&conn,"localhost","root","","test",0,NULL,CLIENT_FOUND_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字 10 { 11 printf("connect success!\n"); 12 res=mysql_query(&conn,"insert into test values('user','123456')"); 13 if(res) 14 { 15 printf("error\n"); 16 } 17 else 18 { 19 printf("OK\n"); 20 } 21 mysql_close(&conn); 22 } 23 return 0; 24 }
代码不是很难理解,就不解释了。
5.编译程序
使用的编译代码(注意哪两个不是单引号而是反单引号)
g++ test.cpp `mysql_config --cflags --libs` -o test
6.运行代码
./test
7.再次查看数据库
mysql>use test;
mysql>select * from test;
这样就可以查看到插入的信息了。
================我是分割线============================
1 #include <stdio.h> 2 #include <mysql.h> 3 #define HOST "localhost" 4 #define USERNAME "root" 5 #define PASSWORD "" 6 #define DATABASE "test" 7 8 void insert_sql(char * sql); 9 void query_sql(char* sql); 10 int main(int argc,char *argv[]) 11 { 12 //insert_sql("insert into test values('user','123456')"); 13 query_sql("select * from test"); 14 return 0; 15 } 16 17 void insert_sql(char * sql) 18 { 19 MYSQL conn; 20 int res; 21 mysql_init(&conn); 22 if(mysql_real_connect(&conn,"localhost","root","","test",0,NULL,CLIENT_FOUND_ROWS)) 23 { 24 printf("connect success!\n"); 25 res=mysql_query(&conn,sql); 26 if(res) 27 { 28 printf("error\n"); 29 } 30 else 31 { 32 printf("OK\n"); 33 } 34 mysql_close(&conn); 35 } 36 37 } 38 39 void query_sql(char* sql) 40 { 41 MYSQL my_connection; /*这是一个数据库连接*/ 42 int res; /*执行sql語句后的返回标志*/ 43 MYSQL_RES *res_ptr; /*指向查询结果的指针*/ 44 MYSQL_FIELD *field; /*字段结构指针*/ 45 MYSQL_ROW result_row; /*按行返回的查询信息*/ 46 47 int row, column; /*查询返回的行数和列数*/ 48 int i, j; /*只是控制循环的两个变量*/ 49 50 /*初始化mysql连接my_connection*/ 51 mysql_init(&my_connection); 52 53 /*这里就是用了mysql.h里的一个函数,用我们之前定义的那些宏建立mysql连接,并 54 * 返回一个值,返回不为空证明连接是成功的*/ 55 if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, CLIENT_FOUND_ROWS)) 56 { 57 /*连接成功*/ 58 printf("数据库查询query_sql连接成功!\n"); 59 /*这句话是设置查询编码为utf8,这样支持中文*/ 60 mysql_query(&my_connection, "set names utf8"); 61 62 /*下面这句话就是用mysql_query函数来执行我们刚刚传入的sql語句, 63 * 这会返回一个int值,如果为0,证明語句执行成功*/ 64 res = mysql_query(&my_connection, sql); 65 66 if (res) 67 { /*现在就代表执行失败了*/ 68 printf("Error: mysql_query !\n"); 69 /*不要忘了关闭连接*/ 70 mysql_close(&my_connection); 71 } 72 else 73 { 74 /*现在就代表执行成功了*/ 75 /*将查询的結果给res_ptr*/ 76 res_ptr = mysql_store_result(&my_connection); 77 78 /*如果结果不为空,就把结果print*/ 79 if (res_ptr) 80 { 81 /*取得結果的行数和*/ 82 column = mysql_num_fields(res_ptr); 83 row = mysql_num_rows(res_ptr) + 1; 84 printf("查询到 %lu 行 \n", row); 85 86 /*输出結果的字段名*/ 87 for (i = 0; field = mysql_fetch_field(res_ptr); i++) 88 printf("%s\t", field->name); 89 printf("\n"); 90 91 /*按行输出結果*/ 92 for (i = 1; i < row; i++) 93 { 94 result_row = mysql_fetch_row(res_ptr); 95 for (j = 0; j < column; j++) 96 printf("%s\t", result_row[j]); 97 printf("\n"); 98 } 99 100 } 101 102 /*不要忘了关闭连接*/ 103 mysql_close(&my_connection); 104 } 105 } 106 }
其实数据库的增加,删除,更新等操作比较简单,都是返回一个值表示成功与否。而查询比较麻烦。返回一个结果集,所以操作起来比较麻烦!
===============2015年6月29日 更新========================
上面的这段代码我在平时练习中经常使用到包括近一年来的那些连接mysql数据库的代码都是以这个为模版的。但是最近在实际项目中用到这个代码,一开始没有发现问题,但是在项目进行测试的时候发现出现内存泄漏的问题,经查询是上面代码存在两处内存泄漏问题。
1.mysql结果集问题。由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
2.本以为这样就应该没有问题了,但是进行模拟压力测试时,发现每次连接都会产生8~16K的内存(单纯的进行mysql连接),查了一下资料,是每次调用mysql连接后除了进行mysql_close之外,还要使用mysql_library_end进行释放。(http://www.cnblogs.com/cobbliu/p/3709051.html)
参考资料:
http://blog.csdn.net/fykhlp/article/details/5950485#
作者:无脑仔的小明 出处:http://www.cnblogs.com/wunaozai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。有需要沟通的,可以站内私信,文章留言,或者关注“无脑仔的小明”公众号私信我。一定尽力回答。 |