MySQL C API 使用(基本函式)
基礎入門
一:基礎函式
A: mysql_init()——分配或初始化與mysql_real_connect()相適應的MYSQL物件。
MYSQL* mysql_init(MYSQL* mysql);
補充:如果mysql是NULL指標,該函式將分配、初始化、並返回新物件。否則,將初始化物件,並返回物件的地址。如果mysql_init()分配了新的物件,應當在程式中呼叫mysql_close() 來關閉連線,以釋放物件。
B: mysql_options()——用於設定額外的連線選項並影響連線的行為,可多次呼叫此函式來設定多個選項。
int mysql_options(MYSQL* mysql,enum mysql_option,const void* arg);
補充:在mysql_init()之後與mysql_real_connect()之前呼叫mysql_options()。
C: mysql_real_connect()——連線到MySQL server
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連線控制代碼結構的任何其它API函式之前,mysql_real_connect() 必須成功完成。
引數:“host”——必須是主機名或IP地址。如果host是NULL或字串“localhost”,連線將被視為與本地主機連線。
“unix_socket”——通常指定為NULL
“client_flag”——通常為0,但是,也能將其設定為具有特定功能的標誌組合。(詳情參考:
D: mysql_query()——執行以null結尾的字串指定的sql查詢語句
int mysql_query(MYSQL* mysql,const char* stmt_str)
補充:mysql_query() 不能用於執行包含二進位制資料的sql查詢語句,此時,你必須使用mysql_real_query()。
如果執行成功將返回0,如果執行錯誤,將返回非0值。
E: mysql_store_result()——向客戶端檢索完整的結果集
MYSQL_RES* mysql_store_result(MYSQL* mysql)
說明:在呼叫mysql_query()或者mysql_real_query() 之後,你必須呼叫mysql_store_result()或者mysql_use_result() 對於那些成功檢索了資料的每個查詢(select,show,describe,explain,check table等)。
mysql_store_result()將查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,並將結果置於該結構中。
呼叫mysql_num_rows()可以找出結果集中的行數。可以呼叫mysql_fetch_row()來獲取結果集中的行,或呼叫mysql_row_seek()和mysql_row_tell()來獲取或設定結果集中的當前行位置。
在對結果集處理完成之後,也必須呼叫mysql_free_result()函式釋放記憶體。
F: mysql_use_result()——啟動逐行結果集檢索
MYSQL_RES* mysql_use_result(MYSQL* mysql)
說明:mysql_use_result() 不像mysql_store_result() 那樣將結果集實際讀取到客戶端。它必須通過對mysql_fetch_row() 的呼叫,對每一行分別進行檢索。這將直接從伺服器讀取結果,而不會將其儲存到臨時表或本地緩衝區內,與mysql_store_result() 相比,速度更快而且使用的記憶體更少。使用mysql_use_result() 時,必須執行mysql_fetch_row() ,直至返回NULL值。
G: mysql_fetch_row()——從結果集中獲取下一行
MYSQL_ROW mysql_fetch_row(MYSQL_RES* result)
返回值:下一行的MYSQL_ROW結構。(如果沒有更多的行可檢索或者發生錯誤時,則返回NULL)
H: mysql_free_result()——釋放結果集使用的記憶體
void mysql_free_result(MYSQL_RES* result)
說明:當你完成了對結果集的處理之後,你必須釋放其使用的記憶體(通過呼叫mysql_free_result() 函式)。也不要嘗試在釋放記憶體之後,去獲取結果集。
I: mysql_error()——返回最近呼叫MySQL函式發生的錯誤資訊
const char* mysql_error(MYSQL* mysql)
返回值:描述錯誤資訊的以null結尾的字串,如果未發生錯誤,則返回空字串。
M: mysql_close()——關閉一個server連線
void mysql_close(MYSQL* mysql)
說明:關閉前面已經開啟的連線。如果控制代碼是由mysql_init() 或mysql_connect() 自定分配的,mysql_close() 還將解除分配由mysql指向的連線控制代碼。
二:使用範例
注:在windows系統上的Vistual Studio開發環境下需要包含標頭檔案#include <mysql.h>,並新增必要的庫檔案。在專案屬性頁介面也需要新增必要的包含目錄和庫目錄。
#include <iostream>
#include <string>
//MySQL庫(第三方庫)
#include <mysql.h>
#pragma comment(lib,"libmysql.lib")
//全域性變數宣告
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;
unsigned int num_fields;
//連線資料庫
bool ConnectDatabase()
{
//初始化資料庫
mysql_init(&mysql);
//連線到MySQL server
if((mysql_real_connect(&mysql,"127.0.0.1","root",
"Admin123456","test_sql",3306,NULL,0)))
{
printf("Error connecting to database:%s\n",mysql_error(&mysql));
return false;
}
else
{
printf("connected...\n");
return true;
}
}
//查詢資料
void QueryData(std::string& query_sql_string)
{
const char* query_buffer=query_sql_string.c_str();
if(mysql_query(&mysql,query_buffer)
{
printf("Query failed(%s)\n",mysql_error(&mysql));
}
else
{
printf("Query success\n");
res=mysql_store_result(&mysql);
num_fields=mysql_num_fields(res);
while((row=mysql_fetch_row(res))!=NULL)
{
if(row[6]!=NULL)
{
std::string temp_string =ResultConvertToJson(row);
ConvertUTF8ToGBK(temp_string);
std::cout<<temp_string<<std::endl;
}
}
mysql_free_result(res); //釋放記憶體
}
}
int main()
{
ConnectDatabase();
std::string query_string = "select * from test_sql.adsbtable where TargetIdentification regexp \"CCA\" and WriteTime between \"2018-12-19 11:34:46.545\" and \"2018-12-19 11:45:49.545\" and substring(PositionInWGS_84Coordinates, 11) between 101.105301 and 107.387639 and substring(PositionInWGS_84Coordinates,1,9) between 28.105045 and 33.500975";
QueryData(query_string);
mysql_close(&mysql);
return 0;
}
三:說明
對於C++程式設計師來說,MySQL官方提供的C API(https://dev.mysql.com/doc/refman/8.0/en/c-api.html)已經能滿足大多數應用場景。
如果為了追求效率和C++特性,可以選擇基於此 C API進行再封裝的第三方庫MySQL++(https://tangentsoft.com/mysqlpp/home)