欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

準備工作

  1. 保證 MySQL 服務有效。
  2. 下載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)方法

    這篇文章主要介紹了Inline Hook(ring3)的簡單C++實現(xiàn)方法,需要的朋友可以參考下
    2014-08-08
  • 用c語言實現(xiàn)一個電話薄(附完整代碼)

    用c語言實現(xiàn)一個電話薄(附完整代碼)

    大家好,本篇文章主要講的是用c語言實現(xiàn)一個電話?。ǜ酵暾a),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C語言利用cJSON解析JSON格式全過程

    C語言利用cJSON解析JSON格式全過程

    cJSON是用于解析json格式字符串的一套api,非常好用,下面這篇文章主要給大家介紹了關于C語言利用cJSON解析JSON格式的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • C/C++ 監(jiān)控磁盤與目錄操作的示例

    C/C++ 監(jiān)控磁盤與目錄操作的示例

    這篇文章主要介紹了C/C++ 監(jiān)控磁盤與目錄操作的示例,幫助大家更好的理解和學習C/C++編程,感興趣的朋友可以了解下
    2020-10-10
  • C++超詳細講解友元的使用

    C++超詳細講解友元的使用

    采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-04-04
  • 一文詳解C++11中的lambda函數(shù)

    一文詳解C++11中的lambda函數(shù)

    小編可以明確告訴大家:lambda函數(shù)是C++11中最重要的,使用最廣泛的,最具現(xiàn)代風格的內(nèi)容,lambda函數(shù)的出現(xiàn)改變了C++編程的思維方式。所以快和小編學習一下C++11中l(wèi)ambda函數(shù)的使用吧
    2023-02-02
  • C++實現(xiàn)簡易通訊錄

    C++實現(xiàn)簡易通訊錄

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡易通訊錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++ 學習之旅三 我和超級瑪麗有個約會

    C++ 學習之旅三 我和超級瑪麗有個約會

    學習了c++有一周有余了吧,感謝孫鑫老師的視頻教程,讓我   對C++有了基本的了解,并理解到C++與.net 的許許多多的區(qū)別,更要感謝網(wǎng)民為programaking的人,會為我提供了超級瑪麗制作揭秘 這套寶貴的教程,讓我 做做出了這個項目,對c++ 有了一個更深層次的認識
    2012-11-11
  • C語言實現(xiàn)Floyd算法

    C語言實現(xiàn)Floyd算法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)Floyd算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言廣播的使用詳解

    C語言廣播的使用詳解

    顧名思義可以把自己的數(shù)據(jù)發(fā)送給在特定范圍內(nèi)的所有人;我們網(wǎng)絡編程中的廣播一般是通過特定的廣播地址把自己的數(shù)據(jù)發(fā)送給局域網(wǎng)內(nèi)當前在線的客戶端
    2022-05-05

最新評論