1. 程式人生 > >linux 下c++ 操作mysql 的封裝

linux 下c++ 操作mysql 的封裝

Linux下c++操作mysql有兩種方式,一種是基於mysqlconnecter,一種是基於mysql自帶的c的API,此次對API方式做下總結主要是理清思路,明白操作流程,熟悉介面函式的應用和sql語句的用法。

首先先列一下操作函式:

1>連線函式

MYSQL *mysql_real_connect(MYSQL *mysql, 

                                                      const char *host,

                                                      const char *user,

                                                      const char *passwd,

                                                      const char *db,

                                                      unsigned int port,

                                                      const char *unix_socket,

                                                      unsigned long client_flag)

裡面的引數分別為,一個指向MYSQL結構體的指標,目的mysql伺服器的ip,使用者名稱,密碼,資料庫名,埠號,*unix_socket可以置為NULL,client_flag置為0。

2>查詢函式

 (1)int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)

(2)int mysql_query(MYSQL *mysql, const char *query)

mysql_query()不能用於語句包含二進位制資料,你必須使用mysql_real_query()代替。 (二進位制資料可能包含“\ 0”的性質,這mysql_query()作為字串結束的宣告解釋。)此外,mysql_real_query()比快mysql_query(),因為它不呼叫strlen()來對語句字串。

查詢函式用來執行sql語句。

3>獲取結果集

(1)mysql_store_result(&mysql)

(2)mysql_use_result(&mysql)

兩者的主要區別是,mysql_use_result()的結果必須“一次性用完”,也就是說用它得到一個result後,必須反覆用mysql_fetch_row()讀取其結果直至該函式返回null為止,否則如果你再次進行mysql查詢,會得到“Commands out of sync; you can't run this command now”的錯誤。

而mysql_store_result()得到result是存下來的,你無需把全部行結果讀完,就可以進行另外的查詢。比如你進行一個查詢,得到一系列記錄,再根據這些結果,用一個迴圈再進行資料庫查詢,就只能用mysql_store_result()。

對於成功檢索了資料的每個查詢(SELECTSHOWDESCRIBEEXPLAINCHECK TABLE),必須呼叫mysql_store_result()mysql_use_result()

對於其他查詢,不需要呼叫mysql_store_result()mysql_use_result(),但是如果在任何情況下均呼叫了mysql_store_result()它也不會導致任何傷害或效能降低。通過檢查mysql_store_result()是否返回0,可檢測查詢是否返回了結果集

3>結果集分析相關函式

mysql的結果集其實就是一個MYSQL_RES結構,其定義如下:

typedef structst_mysql_res{

  my_ulonglong row_count;                              // 結果集的行數

  unsigned intfield_count, current_field;           // 結果集的列數,當前列

  MYSQL_FIELD*fields;                                   // 結果集的列資訊

  MYSQL_DATA*data;                                     // 結果集的資料

  MYSQL_ROWS*data_cursor;                       // 結果集的游標

  MEM_ROOTfield_alloc;                                   // 記憶體結構

  MYSQL_ROWrow;                                        // 非緩衝的時候用到

  MYSQL_ROWcurrent_row;                           //mysql_store_result時會用到。當前行

  unsigned long *lengths;                               //每列的長度

  MYSQL*handle;                                          // mysql_use_result會用。

  my_booleof;                                                //是否為行尾

} MYSQL_RES;

(1)獲取結果集中的欄位數(列數)

mysql_num_fields(result)

(2)獲取結果集中的記錄數(行數)

mysql_num_rows(result)

(3)獲取一行的內容

mysql_fetch_row(result)

MYSQL_ROW row;
row = mysql_fetch_row(result)

(4)獲取一列的內容

mysql_fetch_field(result)

MYSQL_FIELD *field; //列資訊儲存在MYSQL_FIELD結構體中
while((field = mysql_fetch_field(result)))
{
  printf("field name %s/n", field->name);
}

(5)

int mysql_affected_rows() 返回最近一次與 連線控制代碼 關聯的 INSERT,UPDATE 或 DELETE 查詢所影響的記錄行數。如果連線控制代碼沒有指定, 則預設使用最近一次由 mysql_connect() 函式開啟的連線控制代碼。

一旦完成了對結果集的操作,必須呼叫mysql_free_result(result);釋放完結果集不要在去獲取

4>資料庫類的封裝

DB.h

class DB

{

   public:

       DB();

       ~DB();

       bool connect();

       bool insert();

       bool delete();

      bool update();

private:

      MYSQL *mysql;//mysql結構體,幾乎各個函式都會用到它

      MYSQL_RES *result;//結果集結構體指標

      MYSQL_ROW row;記錄結構體例項

      MYSQL_FIELD *field;//欄位結構體例項指標

      }

DB.cpp

DB::DB()

{

  mysql=mysql_init(mysql);

  if(NULL==mysql)

    {

       cout<<"error:"<<mysql_error(mysql)<<endl;

    }

}

DB::~DB()

{

    if(NULL==mysql)

    {

       mysql_close(mysql);

    }

}