最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C/C++訪問(wèn)MySQL的教程詳解

 更新時(shí)間:2024年08月16日 09:10:20   作者:4C++  
在實(shí)際開(kāi)發(fā)中,語(yǔ)言連接MySQL是為了能夠在編程語(yǔ)言中與MySQL數(shù)據(jù)庫(kù)進(jìn)行交互和操作,大部分情況我們都是通過(guò)語(yǔ)言連接MySQL,建立與MySQL數(shù)據(jù)庫(kù)的連接,本篇文章主要講解使用C/C++訪問(wèn)MySQL的教程,需要的朋友可以參考下

準(zhǔn)備工作

  1. 保證 MySQL 服務(wù)有效。
  2. 下載MySQL開(kāi)發(fā)包(可以在MySQL官網(wǎng)下載安裝也可以在軟件源安裝)

MySQL 開(kāi)發(fā)包通常會(huì)包含一些特定的頭文件和庫(kù)文件。您可以檢查以下常見(jiàn)的路徑:

 
  • /usr/include/mysql :查找 MySQL 相關(guān)的頭文件。

  • /usr/lib 或 /usr/lib64 :查找與 MySQL 相關(guān)的庫(kù)文件,例如 libmysqlclient.so 。

嘗試鏈接 MySQL Client

通過(guò) mysql_get_client_info() 函數(shù),來(lái)驗(yàn)證我們的引入是否成功。

#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

運(yùn)行時(shí)出現(xiàn)錯(cuò)誤:

user1@hecs-133240:~$./test
./test: error while loading shared libraries: libmysqlclient.so.18: cannot open shared
object file: No such file or directory

解決方法:設(shè)置動(dòng)態(tài)庫(kù)查找路徑

user1@hecs-133240:~$ export LD_LIBRARY_PATH =./lib 

這樣就成功地將當(dāng)前目錄下的 lib 文件夾添加到了 LD_LIBRARY_PATH 環(huán)境變量中,使得系統(tǒng)在運(yùn)行程序查找動(dòng)態(tài)鏈接庫(kù)時(shí),也會(huì)在這個(gè)指定的目錄中進(jìn)行搜索。

再次運(yùn)行:

user1@hecs-133240:~$./test
mysql client Version: 6.1.6

至此引入庫(kù)的工作已經(jīng)做完,接下來(lái)就是熟悉接口。

MySQL 接口介紹

1.初始化 mysql_init()
要使用庫(kù),必須先進(jìn)行初始化!

MYSQL *mysql_init(MYSQL *mysql);

例如:MYSQL *mfp = mysql_init(NULL); 

返回值是一個(gè)MySQL文件句柄,后續(xù)的操作都要用它

2. 鏈接數(shù)據(jù)庫(kù) mysql_real_connect
初始化完畢之后,必須先鏈接數(shù)據(jù)庫(kù),再進(jìn)行后續(xù)操作。(MySQL 網(wǎng)絡(luò)部分是基于 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);

注意:建立好鏈接之后,如果獲取中文是亂碼,需要設(shè)置鏈接的默認(rèn)字符集是 utf8,原始默認(rèn)是 latin1。

mysql_set_character_set(myfd, "utf8");

第一個(gè)參數(shù) MYSQL 是 C API 中一個(gè)非常重要的變量(mysql_init 的返回值),里面內(nèi)存非常豐富,有 port、dbname、charset 等連接基本參數(shù)。它也包含了一個(gè)叫 st_mysql_methods 的結(jié)構(gòu)體變量,該變量里面保存著很多函數(shù)指針,這些函數(shù)指針將會(huì)在數(shù)據(jù)庫(kù)連接成功以后的各種數(shù)據(jù)操作中被調(diào)用。mysql_real_connect 函數(shù)中各參數(shù),基本都是顧名思義。

3. 下發(fā) MySQL 命令 mysql_query

// 返回0表示成功,非0失敗
int mysql_query(MYSQL *mysql, const char *q);

第一個(gè)參數(shù)上面已經(jīng)介紹過(guò),第二個(gè)參數(shù)為要執(zhí)行的 SQL 語(yǔ)句,如“select * from table”。

4. 獲取執(zhí)行結(jié)果 mysql_store_result

SQL 執(zhí)行完以后,如果是查詢語(yǔ)句,我們當(dāng)然還要讀取數(shù)據(jù),如果是 update、insert 等語(yǔ)句,那么就看下操作成功與否即可。我們來(lái)看看如何獲取查詢結(jié)果:

如果 mysql_query 返回成功,那么我們就通過(guò) mysql_store_result 這個(gè)函數(shù)來(lái)讀取結(jié)果。原型如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

該函數(shù)會(huì)調(diào)用 MYSQL 變量中的 st_mysql_methods 中的 read_rows 函數(shù)指針來(lái)獲取查詢的結(jié)果。同時(shí)該函數(shù)會(huì)返回 MYSQL_RES 這樣一個(gè)變量,該變量主要用于保存查詢的結(jié)果。同時(shí)該函數(shù) malloc 了一片內(nèi)存空間來(lái)存儲(chǔ)查詢過(guò)來(lái)的數(shù)據(jù),

所以我們一定要記得 free(result),不然是肯定會(huì)造成內(nèi)存泄漏的;但較高版本的MySQL直接使用free釋放內(nèi)存會(huì)直接出現(xiàn)段錯(cuò)誤,我們需要使用專門提供的庫(kù)函數(shù)mysql_free_result(res);
執(zhí)行完 mysql_store_result 以后,其實(shí)數(shù)據(jù)都已經(jīng)在 MYSQL_RES 變量中了,下面的 API 基本就是讀取 MYSQL_RES 中的數(shù)據(jù)。

  • 獲取結(jié)果行數(shù) mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
  • 獲取結(jié)果列數(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;
  • 獲取結(jié)果內(nèi)容 mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

它會(huì)返回一個(gè) MYSQL_ROW 變量,MYSQL_ROW 其實(shí)就是 char **。就當(dāng)成一個(gè)二維數(shù)組來(lái)用吧。
例如:

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; 
}
  • 關(guān)閉 MySQL 鏈接 mysql_close
void mysql_close(MYSQL *sock);

另外,MySQL C API 還支持事務(wù)等常用操作:

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 中,事務(wù)操作是確保數(shù)據(jù)一致性和完整性的重要手段。

  • 開(kāi)啟事務(wù)

使用 mysql_autocommit() 函數(shù)來(lái)關(guān)閉自動(dòng)提交模式,從而開(kāi)啟一個(gè)事務(wù)。

if (mysql_autocommit(conn, 0)!= 0) {
    // 處理錯(cuò)誤
}
  • 執(zhí)行事務(wù)中的操作

在事務(wù)開(kāi)啟后,可以執(zhí)行一系列的數(shù)據(jù)庫(kù)操作,例如插入、更新、刪除數(shù)據(jù)等。

  • 提交事務(wù)

使用 mysql_commit() 函數(shù)來(lái)提交事務(wù),使事務(wù)中的操作生效。

if (mysql_commit(conn)!= 0) {
    // 處理錯(cuò)誤
}
  • 回滾事務(wù)

如果在事務(wù)執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤或需要取消事務(wù)的操作,可以使用 mysql_rollback() 函數(shù)進(jìn)行回滾。

if (mysql_rollback(conn)!= 0) {
    // 處理錯(cuò)誤
}

例如,如果在一個(gè)銀行轉(zhuǎn)賬的場(chǎng)景中,從賬戶 A 向賬戶 B 轉(zhuǎn)賬,需要先從賬戶 A 扣除相應(yīng)金額,如果這個(gè)操作成功,再向賬戶 B 增加相應(yīng)金額。如果在向賬戶 B 增加金額時(shí)出現(xiàn)錯(cuò)誤,就需要回滾之前從賬戶 A 扣除金額的操作,以保證數(shù)據(jù)的一致性。

在實(shí)際使用中,要注意及時(shí)處理函數(shù)返回的錯(cuò)誤碼,以確保事務(wù)操作的正確執(zhí)行。

總結(jié):

以上就是使用C/C++訪問(wèn)MySQL的教程詳解的詳細(xì)內(nèi)容,更多關(guān)于C/C++訪問(wèn)MySQL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫(xiě)運(yùn)行C、C++的教程詳解(Windows)【真正的小白版】

    Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫(xiě)運(yùn)行C、C++的教程詳解(Windows

    這篇文章主要介紹了Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫(xiě)運(yùn)行C、C++的教程詳解(Windows)【真正的小白版】,圖文詳解介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++設(shè)計(jì)模式之抽象工廠模式

    C++設(shè)計(jì)模式之抽象工廠模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之抽象工廠模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C語(yǔ)言實(shí)現(xiàn)鏈棧的步驟

    C語(yǔ)言實(shí)現(xiàn)鏈棧的步驟

    鏈棧是棧的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),鏈棧可以用單鏈表的頭插法實(shí)現(xiàn),本文主要講述了如何用c語(yǔ)言去實(shí)現(xiàn)鏈棧,感興趣的朋友可以了解下
    2021-05-05
  • 淺談C語(yǔ)言=與==的區(qū)別詳解

    淺談C語(yǔ)言=與==的區(qū)別詳解

    這篇文章主要介紹了淺談C語(yǔ)言=與==的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++ string 類原理、踩坑與對(duì)象語(yǔ)義詳解

    C++ string 類原理、踩坑與對(duì)象語(yǔ)義詳解

    本文給大家介紹C++ string 類原理、踩坑與對(duì)象語(yǔ)義詳解,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-05-05
  • C語(yǔ)言中static的使用介紹

    C語(yǔ)言中static的使用介紹

    大家好,本篇文章主要講的是C語(yǔ)言中static的使用介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • strncpy與snprintf 的用法比較

    strncpy與snprintf 的用法比較

    以下是對(duì)strncpy與snprintf的具體用法以及區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-07-07
  • 關(guān)于C++面向?qū)ο笤O(shè)計(jì)的訪問(wèn)性問(wèn)題詳解

    關(guān)于C++面向?qū)ο笤O(shè)計(jì)的訪問(wèn)性問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于C++面向?qū)ο笤O(shè)計(jì)的訪問(wèn)性問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • C++私有繼承(二)

    C++私有繼承(二)

    這篇文章主要介紹了C++私有繼承,在私有繼承時(shí),基類的公有對(duì)象以及保護(hù)對(duì)象會(huì)變成派生類的私有對(duì)象。我們可以在派生類方法當(dāng)中使用它,但無(wú)法通過(guò)派生類對(duì)象直接調(diào)用,但無(wú)法訪問(wèn)基類的私有方法和對(duì)象,下面具體內(nèi)容,需要的朋友可以參考一下
    2022-01-01
  • 一文詳解C++的訪問(wèn)說(shuō)明符

    一文詳解C++的訪問(wèn)說(shuō)明符

    訪問(wèn)說(shuō)明符是 C++ 中控制類成員(屬性和方法)可訪問(wèn)性的關(guān)鍵字,它們用于封裝類數(shù)據(jù)并保護(hù)其免受意外修改或?yàn)E用,本文將給大家詳細(xì)的介紹一下C++的訪問(wèn)說(shuō)明符,感興趣的朋友可以參考下
    2024-04-04

最新評(píng)論

新竹市| 张家川| 赤峰市| 河西区| 石首市| 石首市| 永和县| 平顺县| 邳州市| 武宁县| 娄底市| 大埔县| 钟祥市| 楚雄市| 台山市| 永定县| 汝阳县| 定陶县| 庆云县| 新绛县| 离岛区| 龙陵县| 招远市| 临桂县| 马尔康县| 阳东县| 长宁区| 宜都市| 易门县| 凤城市| 陇川县| 太谷县| 富蕴县| 阿巴嘎旗| 左权县| 北辰区| 碌曲县| 石台县| 莱芜市| 罗源县| 新闻|