使用C/C++訪問MySQL的教程詳解
準備工作
- 保證 MySQL 服務有效。
- 下載MySQL開發(fā)包(可以在MySQL官網(wǎng)下載安裝也可以在軟件源安裝)
MySQL 開發(fā)包通常會包含一些特定的頭文件和庫文件。您可以檢查以下常見的路徑:
/usr/include/mysql :查找 MySQL 相關的頭文件。
/usr/lib 或 /usr/lib64 :查找與 MySQL 相關的庫文件,例如 libmysqlclient.so 。
嘗試鏈接 MySQL Client
通過 mysql_get_client_info()
函數(shù),來驗證我們的引入是否成功。
#include <stdio.h> #include <mysql.h> int main() { printf("mysql client Version: %s\n", mysql_get_client_info()); return 0; }
編譯命令:
user1@hecs-133240:~$ gcc - o test test.c - I./include - L./lib - lmysqlclient
運行時出現(xiàn)錯誤:
user1@hecs-133240:~$./test ./test: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
解決方法:設置動態(tài)庫查找路徑
user1@hecs-133240:~$ export LD_LIBRARY_PATH =./lib
這樣就成功地將當前目錄下的 lib
文件夾添加到了 LD_LIBRARY_PATH
環(huán)境變量中,使得系統(tǒng)在運行程序查找動態(tài)鏈接庫時,也會在這個指定的目錄中進行搜索。
再次運行:
user1@hecs-133240:~$./test mysql client Version: 6.1.6
至此引入庫的工作已經(jīng)做完,接下來就是熟悉接口。
MySQL 接口介紹
1.初始化 mysql_init()
:
要使用庫,必須先進行初始化!
MYSQL *mysql_init(MYSQL *mysql);
例如:MYSQL *mfp = mysql_init(NULL);
返回值是一個MySQL文件句柄,后續(xù)的操作都要用它
2. 鏈接數(shù)據(jù)庫 mysql_real_connect
:
初始化完畢之后,必須先鏈接數(shù)據(jù)庫,再進行后續(xù)操作。(MySQL 網(wǎng)絡部分是基于 TCP/IP 的)
//返回nullptr則代表連接失敗 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 clientflag);
注意:建立好鏈接之后,如果獲取中文是亂碼,需要設置鏈接的默認字符集是 utf8,原始默認是 latin1。
mysql_set_character_set(myfd, "utf8");
第一個參數(shù) MYSQL 是 C API 中一個非常重要的變量(mysql_init 的返回值),里面內(nèi)存非常豐富,有 port、dbname、charset 等連接基本參數(shù)。它也包含了一個叫 st_mysql_methods 的結構體變量,該變量里面保存著很多函數(shù)指針,這些函數(shù)指針將會在數(shù)據(jù)庫連接成功以后的各種數(shù)據(jù)操作中被調(diào)用。mysql_real_connect 函數(shù)中各參數(shù),基本都是顧名思義。
3. 下發(fā) MySQL 命令 mysql_query
:
// 返回0表示成功,非0失敗 int mysql_query(MYSQL *mysql, const char *q);
第一個參數(shù)上面已經(jīng)介紹過,第二個參數(shù)為要執(zhí)行的 SQL 語句,如“select * from table”。
4. 獲取執(zhí)行結果 mysql_store_result
:
SQL 執(zhí)行完以后,如果是查詢語句,我們當然還要讀取數(shù)據(jù),如果是 update、insert 等語句,那么就看下操作成功與否即可。我們來看看如何獲取查詢結果:
如果 mysql_query 返回成功,那么我們就通過 mysql_store_result 這個函數(shù)來讀取結果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
該函數(shù)會調(diào)用 MYSQL 變量中的 st_mysql_methods 中的 read_rows 函數(shù)指針來獲取查詢的結果。同時該函數(shù)會返回 MYSQL_RES 這樣一個變量,該變量主要用于保存查詢的結果。同時該函數(shù) malloc 了一片內(nèi)存空間來存儲查詢過來的數(shù)據(jù),
所以我們一定要記得 free(result),不然是肯定會造成內(nèi)存泄漏的;但較高版本的MySQL直接使用free釋放內(nèi)存會直接出現(xiàn)段錯誤,我們需要使用專門提供的庫函數(shù)mysql_free_result(res);
執(zhí)行完 mysql_store_result 以后,其實數(shù)據(jù)都已經(jīng)在 MYSQL_RES 變量中了,下面的 API 基本就是讀取 MYSQL_RES 中的數(shù)據(jù)。
- 獲取結果行數(shù)
mysql_num_rows
:
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 獲取結果列數(shù)
mysql_num_fields
:
unsigned int mysql_num_fields(MYSQL_RES *res);
- 獲取列名
mysql_fetch_fields
:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
例如:
int fields = mysql_num_fields(res); MYSQL_FIELD *field = mysql_fetch_fields(res); int i = 0; for(; i < fields; i++){ cout<<field[i].name<<" "; } cout<<endl;
- 獲取結果內(nèi)容
mysql_fetch_row
:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它會返回一個 MYSQL_ROW
變量,MYSQL_ROW
其實就是 char **
。就當成一個二維數(shù)組來用吧。
例如:
i = 0; MYSQL_ROW line; for(; i < nums; i++){ line = mysql_fetch_row(res); int j = 0; for(; j < fields; j++){ cout<<line[j]<<" "; } cout<<endl; }
- 關閉 MySQL 鏈接
mysql_close
:
void mysql_close(MYSQL *sock);
另外,MySQL C API 還支持事務等常用操作:
my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); my_bool STDCALL mysql_commit(MYSQL * mysql); my_bool STDCALL mysql_rollback(MYSQL * mysql);
在 MySQL 的 C API 中,事務操作是確保數(shù)據(jù)一致性和完整性的重要手段。
- 開啟事務:
使用 mysql_autocommit()
函數(shù)來關閉自動提交模式,從而開啟一個事務。
if (mysql_autocommit(conn, 0)!= 0) { // 處理錯誤 }
- 執(zhí)行事務中的操作:
在事務開啟后,可以執(zhí)行一系列的數(shù)據(jù)庫操作,例如插入、更新、刪除數(shù)據(jù)等。
- 提交事務:
使用 mysql_commit()
函數(shù)來提交事務,使事務中的操作生效。
if (mysql_commit(conn)!= 0) { // 處理錯誤 }
- 回滾事務:
如果在事務執(zhí)行過程中出現(xiàn)錯誤或需要取消事務的操作,可以使用 mysql_rollback()
函數(shù)進行回滾。
if (mysql_rollback(conn)!= 0) { // 處理錯誤 }
例如,如果在一個銀行轉(zhuǎn)賬的場景中,從賬戶 A 向賬戶 B 轉(zhuǎn)賬,需要先從賬戶 A 扣除相應金額,如果這個操作成功,再向賬戶 B 增加相應金額。如果在向賬戶 B 增加金額時出現(xiàn)錯誤,就需要回滾之前從賬戶 A 扣除金額的操作,以保證數(shù)據(jù)的一致性。
在實際使用中,要注意及時處理函數(shù)返回的錯誤碼,以確保事務操作的正確執(zhí)行。
總結:
以上就是使用C/C++訪問MySQL的教程詳解的詳細內(nèi)容,更多關于C/C++訪問MySQL的資料請關注腳本之家其它相關文章!
相關文章
Inline Hook(ring3)的簡單C++實現(xiàn)方法
這篇文章主要介紹了Inline Hook(ring3)的簡單C++實現(xiàn)方法,需要的朋友可以參考下2014-08-08