程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL學習筆記_11_Linux下C++/C連接MySQL數據庫(一)

MySQL學習筆記_11_Linux下C++/C連接MySQL數據庫(一)

編輯:MySQL綜合教程

MySQL學習筆記_11_Linux下C++/C連接MySQL數據庫(一)




Linux 下 C++/C 連接 MySQL 數據庫(一)


 

一、連接前准備

原材料:Ubuntu12.04LTS

(已經安裝了MySQL5.5或者更高級版本,新立得軟件包,gcc/g++或者CodeBlosks編譯器)

安裝了以上的軟件包後,我們可以正常使用MySQL完成數據管理工作,但是很多時候我們需要通過編寫程序訪問MySQL。此時,在程序中需要加載MySQL驅動頭文件,但是默認這些驅動包是沒有安裝的,因此我們需要在新立得中找到"libmysqld-dev"包並安裝。

安裝完成之後,在”/usr/include/mysql/”目錄下會有很多相對應的頭文件,如mysql.h等。

當寫好程序,需要編譯時:

1、如果選用的是使用gcc/g++在命令行下完成,則需要加上-lmysqlclient選項。如:

 

[plain] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  • g++ -lmysqlclient mysql_test.cc -o mysqltest
    g++ -lmysqlclient mysql_test.cc -o mysqltest

    2、如果選用的是CodeBlocks,則需在構建選項中,將連接庫設為mysqlclient。

    開始編譯。

     

     

    二、頭文件及相關函數分析

    這篇博客中所列的函數全部包含在頭文件下,因此,需要在程序編寫開始處,加入一行:

    [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
    1. #include
      #include 

       

      1、用CAPI連接MySQL數據庫有兩個步驟:

      1)初始化一個連接句柄

      2)建立連接

      所用到的函數如下:

       

      [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
      1. MYSQL *mysql_init(MYSQL *connection); // 初始化連接句柄 //成功返回MySQL結構指針,失敗返回NULL
      2. MYSQL *mysql_real_connect(MYSQL *connection,
      3. const char *server_host, const char *sql_user_name,
      4. const char *sql_password, const char *db_name,
      5. unsigned int port_number, const char *unix_socket_name,
      6. unsigned int flags); //建立連接 //成功返回MySQL結構指針,失敗返回NULL
        MYSQL *mysql_init(MYSQL *connection);				// 初始化連接句柄
        //成功返回MySQL結構指針,失敗返回NULL
        
        MYSQL *mysql_real_connect(MYSQL *connection,   
                                  const char *server_host,                          
                                  const char *sql_user_name,  
                                  const char *sql_password,   
                                  const char *db_name,   
                                  unsigned int port_number,   
                                  const char *unix_socket_name,   
                                  unsigned int flags); 	//建立連接
        //成功返回MySQL結構指針,失敗返回NULL

         

        2、MySQL連接工作完成之後,需要對MySQL的連接進行釋放

        [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
        1. void mysql_close(MYSQL *connection); //關閉連接 //參數connection被清空,指針變為無效
          void mysql_close(MYSQL *connection); //關閉連接
          //參數connection被清空,指針變為無效

          3、mysql_options用於設置額外選項,並影響連接行為,但是它只能在mysql_init和mysql_real_connect之間調用

          [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
          1. int mysql_options(MYSQL *connection, enum mysql_option option, const char *argument); //設置連接選項
            int mysql_options(MYSQL *connection, enum mysql_option option, const char *argument); 				//設置連接選項  

            option的值為下列四個值之一:

             

            [plain] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
          2. MYSQL_INIT_COMMAND //連接到MySQL服務器時將執行的命令,再次連接時將自動再次執行。 MYSQL_OPT_CONNECT_TIMEOUT //連接超時前的等待秒數
          3. MYSQL_OPT_COMPRESS //網絡連接中使用壓縮機制 MYSQL_OPT_PROTOCOL //要使用的協議類型,影視mysql.h中定義的mysql_protocol_type枚舉值之一
            MYSQL_INIT_COMMAND	     //連接到MySQL服務器時將執行的命令,再次連接時將自動再次執行。
            MYSQL_OPT_CONNECT_TIMEOUT    //連接超時前的等待秒數
            MYSQL_OPT_COMPRESS           //網絡連接中使用壓縮機制
            MYSQL_OPT_PROTOCOL	     //要使用的協議類型,影視mysql.h中定義的mysql_protocol_type枚舉值之一

             

            4、以上的函數是在假設沒有錯誤的情況下運行,如果數據庫連接過程中出現了錯誤,我們就需要以下兩個函數來處理錯誤信息:

            [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
            1. unsigned int mysql_errno(MYSQL *connection); //返回錯誤代碼(0表示為出現錯誤) char *mysql_error(MYSQL *connection); //返回錯誤信息,是以NULL作為終結的字符串
              unsigned int mysql_errno(MYSQL *connection);	//返回錯誤代碼(0表示為出現錯誤)  
              char *mysql_error(MYSQL *connection); 			//返回錯誤信息,是以NULL作為終結的字符串 

              5、程序訪問數據庫不只是與數據庫建立連接,更重要的是通過SQL語句的執行查詢或改變數據庫中數據。執行SQL語句可以通過下列函數實現。

               

              [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
              1. int mysql_query(MYSQL *connection, const char *query);
                int mysql_query(MYSQL *connection, const char *query);

                 

                SQL語句分為兩類,返回數據的SQL和不返回數據的SQL(UPDATE、DELETE、INSERT)。

                下面我們只介紹不返回數據的SQL

                 

                [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
                1. my_ulonglong mysql_affected_rows(MYSQL *connection); //返回查詢受影響的行 //對一段SQL語句執行後可以通過調用此函數查看SQL語句執行後,數據庫中數據狀態改變的行數,以此判斷SQL的執行成功與否。
                  my_ulonglong mysql_affected_rows(MYSQL *connection);	//返回查詢受影響的行
                  //對一段SQL語句執行後可以通過調用此函數查看SQL語句執行後,數據庫中數據狀態改變的行數,以此判斷SQL的執行成功與否。

                   

                  三、實例

                  [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
                  1. #include #include
                  2. #include #include
                  3. using namespace std;
                  4. void mysql_err_function(MYSQL * connection);
                  5. int main()
                  6. { //freopen("input.txt","r",stdin);
                  7. MYSQL * connection;
                  8. connection = mysql_init(NULL);
                  9. if (!connection) {
                  10. cout << "mysql_init failed!" << endl;
                  11. exit(-1); }
                  12. if (!mysql_real_connect(connection,"localhost","root","123456","test",0,NULL,0))
                  13. { cout << "Connection To MySQL failed!" << endl;
                  14. mysql_err_function(connection); }
                  15. cout << "Connection To MySQL Server is Success..." << endl;
                  16. string str;
                  17. getline(cin,str);
                  18. int res = 0; int affected_count = 0;
                  19. while (str != "close" && str != "" && !res) {
                  20. res = mysql_query(connection,str.c_str());
                  21. affected_count += mysql_affected_rows(connection);
                  22. if (res) {
                  23. if (mysql_errno(connection)) {
                  24. cout << "Error " << mysql_errno(connection) << " : " << mysql_error(connection) << '\n' << endl;
                  25. break; }
                  26. } getline(cin,str);
                  27. }
                  28. cout << "Have affected " << affected_count << " rows!" << endl;
                  29. mysql_close(connection);
                  30. cout << "Connection To MySQL Server is closed..." << endl;
                  31. return 0; }
                  32. void mysql_err_function(MYSQL * connection)
                  33. { if (mysql_errno(connection))
                  34. { cout << "Error " << mysql_errno(connection) << " : "
                  35. << mysql_error(connection) << endl;
                  36. exit(-1); }
                  37. }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved