• 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!
    ");
    12       res=mysql_query(&conn,"insert into test values('user','123456')");
    13       if(res)
    14       {
    15           printf("error
    ");
    16       }
    17       else
    18       {
    19           printf("OK
    ");
    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!
    ");
     25     res=mysql_query(&conn,sql);
     26     if(res)
     27     {
     28         printf("error
    ");
     29     }
     30     else
     31     {
     32         printf("OK
    ");
     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连接成功!
    ");
     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 !
    ");
     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 行 
    ", row);
     85 
     86         /*输出結果的字段名*/
     87         for (i = 0; field = mysql_fetch_field(res_ptr); i++)
     88             printf("%s	", field->name);
     89         printf("
    ");
     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	", result_row[j]);
     97             printf("
    ");  
     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#

  • 相关阅读:
    DDOS攻击事件记录
    ansible批量安装zabbix客户端并实现自动发现功能
    利用api更新域名解析ip+端口转发【2】
    利用api更新域名解析ip+端口转发【1】
    网站春节开市休市设置
    获取内网路由器管理页面出口ip
    关于nginx加载配置文件的巨坑
    活动封禁刷票ip
    二十五个Python高级开发技巧,终极干货!建议收藏学习!
    一则故事带你秒懂Python GIL原理!
  • 原文地址:https://www.cnblogs.com/wunaozai/p/3618383.html
Copyright © 2020-2023  润新知