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#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM