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

使用C/C++訪問MySQL的教程詳解

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

準備工作

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

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

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

  • /usr/lib 或 /usr/lib64 :查找與 MySQL 相關(guān)的庫文件,例如 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

解決方法:設(shè)置動態(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)絡(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è)置鏈接的默認字符集是 utf8,原始默認是 latin1。

mysql_set_character_set(myfd, "utf8");

第一個參數(shù) MYSQL 是 C API 中一個非常重要的變量(mysql_init 的返回值),里面內(nèi)存非常豐富,有 port、dbname、charset 等連接基本參數(shù)。它也包含了一個叫 st_mysql_methods 的結(jié)構(gòu)體變量,該變量里面保存著很多函數(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í)行結(jié)果 mysql_store_result

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

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

MYSQL_RES *mysql_store_result(MYSQL *mysql);

該函數(shù)會調(diào)用 MYSQL 變量中的 st_mysql_methods 中的 read_rows 函數(shù)指針來獲取查詢的結(jié)果。同時該函數(shù)會返回 MYSQL_RES 這樣一個變量,該變量主要用于保存查詢的結(jié)果。同時該函數(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ù)。

  • 獲取結(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);

它會返回一個 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; 
}
  • 關(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ù)一致性和完整性的重要手段。

  • 開啟事務(wù)

使用 mysql_autocommit() 函數(shù)來關(guān)閉自動提交模式,從而開啟一個事務(wù)。

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

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

  • 提交事務(wù)

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

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

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

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

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

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

總結(jié):

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

相關(guān)文章

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

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

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

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

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

    C語言實現(xiàn)鏈棧的步驟

    鏈棧是棧的鏈式存儲結(jié)構(gòu),鏈??梢杂脝捂湵淼念^插法實現(xiàn),本文主要講述了如何用c語言去實現(xiàn)鏈棧,感興趣的朋友可以了解下
    2021-05-05
  • 淺談C語言=與==的區(qū)別詳解

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

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

    C++ string 類原理、踩坑與對象語義詳解

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

    C語言中static的使用介紹

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

    strncpy與snprintf 的用法比較

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

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

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

    C++私有繼承(二)

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

    一文詳解C++的訪問說明符

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

最新評論

临夏县| 含山县| 保山市| 沧源| 张北县| 宣城市| 浦城县| 高青县| 临沭县| 福贡县| 达州市| 武陟县| 平江县| 靖安县| 常山县| 蒙城县| 来安县| 佛教| 汶川县| 宝应县| 禹城市| 富蕴县| 中宁县| 寻乌县| 安西县| 攀枝花市| 霍邱县| 雷波县| 海淀区| 阳山县| 合肥市| 梓潼县| 兰考县| 南宁市| 刚察县| 渝中区| 汉沽区| 泰兴市| 莒南县| 通榆县| 安福县|