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()。
對於成功檢索了資料的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK 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() 函式開啟的連線控制代碼。
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);
}
}