C/C++連接MySQL數(shù)據(jù)庫(kù)詳細(xì)圖文教程
一.準(zhǔn)備工作
要使用C語(yǔ)言連接mysql,需要使用mysql官網(wǎng)提供的庫(kù),大家可以去官網(wǎng)下載
我們使用C接口庫(kù)來(lái)進(jìn)行連接
要正確使用,我們需要做一些準(zhǔn)備工作:
- 保證mysql服務(wù)有效
- 在官網(wǎng)上下載合適自己平臺(tái)的mysql connect庫(kù),以備后用
- 下載
命令:sudo yum install mysql-devel
二.Connector/C 使用
如果是直接到MySQL官網(wǎng)下載的庫(kù),需要自己打包成庫(kù)使用,將生成的庫(kù)路徑寫入OS。
1.引入MySQL庫(kù)
mysql.c-api5.7function-reference
測(cè)試是否引入成功:
通過(guò) mysql_get_client_info() 函數(shù),來(lái)驗(yàn)證我們的引入是否成功;
#include <iostream> #include </usr/include/mysql/mysql.h> // 頭文件路徑+庫(kù)文件路徑+庫(kù)名 //-I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient using namespace std; int main() { cout << "mysql client Version:" << mysql_get_client_info() << endl; return 0; }
makefile:
test:test.cc g++ -o $@ $^ -std=c++11 -lmysqlclient .PHONY:clear clear: rm -rf test
測(cè)試結(jié)果:
如果在編譯的時(shí)候出現(xiàn)找不到文件,就將完整的庫(kù)文件路徑,頭文件路徑指定清楚:
g++ -o test test.cc -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient
至此引入庫(kù)的工作已經(jīng)做完,接下來(lái)就是熟悉接口.
2.mysql接口介紹
初始化mysql_init():
要使用庫(kù),必須先進(jìn)行初始化!
MYSQL *mysql_init(MYSQL *mysql);
分配或初始化一個(gè)適用于mysql_real_connect()的MYSQL對(duì)象。如果mysql參數(shù)是一個(gè)空指針,函數(shù)將分配、初始化并返回一個(gè)新的對(duì)象。否則,對(duì)象將被初始化,并返回對(duì)象的地址。如果mysql_init()分配了一個(gè)新的對(duì)象,當(dāng)調(diào)用mysql_close()關(guān)閉連接時(shí),它將被釋放。
連接數(shù)據(jù)庫(kù)mysql_real_connect:
初始化完畢之后,必須先鏈接數(shù)據(jù)庫(kù),在進(jìn)行后續(xù)操作。(mysql網(wǎng)絡(luò)部分是基于TCP/IP的)
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_real_connect()嘗試建立與運(yùn)行在主機(jī)上的MySQL服務(wù)器的連接??蛻舳顺绦虮仨氃趫?zhí)行任何其他需要有效的MYSQL連接處理程序結(jié)構(gòu)的有效API函數(shù)之前成功連接到服務(wù)器。
第一個(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ù),基本都是顧名思意。
mysql_real_connect() 的返回值是一個(gè)指向 MYSQL 連接句柄的結(jié)構(gòu)體指針。如果連接成功,返回值為非空指針;如果連接失敗,返回值為 NULL。
測(cè)試代碼:
#include <iostream> #include </usr/include/mysql/mysql.h> // 頭文件路徑+庫(kù)文件路徑+庫(kù)名 //-I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient using namespace std; const char *host = "118.178.232.144"; int main() { cout << "mysql client Version:" << mysql_get_client_info() << endl; MYSQL *mpf = mysql_init(nullptr); MYSQL *mysql_connect = mysql_real_connect(mpf, host, "wangqing", "200209", "scott", 3306, nullptr, 0); if (mysql_connect) cout << "mysql connect success" << endl; else cout << "mysql connect fail" << endl; return 0; }
下發(fā)mysql命令mysql_query:
int mysql_query(MYSQL *mysql, const char *q);
第一個(gè)參數(shù)上面已經(jīng)介紹過(guò),第二個(gè)參數(shù)為要執(zhí)行的sql語(yǔ)句。
測(cè)試代碼:
// 下達(dá)SQL指令 int n = mysql_query(mysql_connect, "insert into stu value(8,'newsuer1')"); int n = mysql_query(mysql_connect, "insert into stu value(9,'newsuer2')"); int n = mysql_query(mysql_connect, "insert into stu value(10,'newsuer3')");
程序執(zhí)行后查看表的內(nèi)容:
獲取執(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);
MYSQL_RES結(jié)構(gòu):
typedef struct st_mysql_res { my_ulonglong row_count; // 行數(shù) MYSQL_FIELD *fields; // 是一個(gè)數(shù)組,包含每一列信息,列名字,等屬性 MYSQL_DATA *data; MYSQL_ROWS *data_cursor; unsigned long *lengths; /* column lengths of current row */ MYSQL *handle; /* for unbuffered reads */ const struct st_mysql_methods *methods; MYSQL_ROW row; /* If unbuffered read 表的內(nèi)容,數(shù)組指針,*/ MYSQL_ROW current_row; /* buffer to current row */ MEM_ROOT field_alloc; unsigned int field_count, current_field; my_bool eof; /* Used by mysql_fetch_row */ /* mysql_stmt_close() had to cancel this result */ my_bool unbuffered_fetch_cancelled; void *extension; } MYSQL_RES;
該函數(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)存泄漏的。 執(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);
測(cè)定代碼:
#include <iostream> #include <string> #include <cstring> #include </usr/include/mysql/mysql.h> // 頭文件路徑+庫(kù)文件路徑+庫(kù)名 //-I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient using namespace std; const char *host = "118.178.232.144"; const char *user = "wangqing"; const char *pass = "200209"; const char *databases = "scott"; const int port = 3306; int main() { // 1.測(cè)試MySQL庫(kù)引入 cout << "mysql client Version:" << mysql_get_client_info() << endl; // 2.創(chuàng)建MySQL對(duì)象 MYSQL *mpf = mysql_init(nullptr); // 3.連接MySQL mysql_real_connect(mpf, host, user, pass, databases, port, nullptr, 0); if (mpf) cout << "mysql connect success" << endl; else cout << "mysql connect fail" << endl; // 4.下達(dá)SQL指令 int n1 = mysql_query(mpf, "select * from stu"); // int n2 = mysql_query(mpf, "insert into stu value(9,'newsuer2')"); // int n3 = mysql_query(mpf, "insert into stu value(10,'newsuer3')"); // 5.獲取執(zhí)行結(jié)果 MYSQL_RES *ret = mysql_store_result(mpf); if (ret) cout << "read result success" << endl; else cout << "read result fail" << endl; // 5.1獲取行數(shù) my_ulonglong count_row = mysql_num_rows(ret); // 5.2獲取列數(shù) unsigned int count_col = mysql_num_fields(ret); cout << count_row << ":" << count_col << endl; // 5.3獲取列名 // MYSQL_FIELD是一個(gè)結(jié)構(gòu)體,里面包含了該列的所有屬性 MYSQL_FIELD *col_mess = mysql_fetch_fields(ret); for (int i = 0; i < count_col; i++) { cout << col_mess[i].name << " "; } cout << endl; mysql_free_result(ret); // 釋放獲取執(zhí)行結(jié)果 mysql_close(mpf); // 關(guān)閉mysql連接 return 0; }
測(cè)試結(jié)果
獲取結(jié)果內(nèi)容mysql_fetch_row:
mysql_fetch_row獲取每一行的結(jié)果并且在下一次調(diào)用時(shí)自動(dòng)指向下一行:
// 5.4獲取數(shù)據(jù) for (int i = 0; i < count_row; i++) { // MYSQL_ROW是一個(gè)字符串?dāng)?shù)組,存儲(chǔ)當(dāng)前行,每一列的數(shù)據(jù) MYSQL_ROW line = mysql_fetch_row(ret); for (int j = 0; j < count_col; j++) cout << line[j] << "\t"; cout << endl; }
關(guān)閉mysql鏈接mysql_close :
void mysql_close(MYSQL *sock);
另外,mysql C api還支持事務(wù)等常用操作,大家下來(lái)自行了解:
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);
附:使用總結(jié)
1.#include<mysql.h>之前一定要加上#include<windows.h>否則會(huì)產(chǎn)生如下錯(cuò)誤:
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C2146: 語(yǔ)法錯(cuò)誤 : 缺少“;”(在標(biāo)識(shí)符“fd”的前面)
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C4430: 缺少類型說(shuō)明符 - 假定為 int。注意: C++ 不支持默認(rèn) int
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C4430: 缺少類型說(shuō)明符 - 假定為 int。注意: C++ 不支持默認(rèn) int
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(366) : error C2065: “SOCKET”: 未聲明的標(biāo)識(shí)符
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(366) : error C2146: 語(yǔ)法錯(cuò)誤 : 缺少“)”(在標(biāo)識(shí)符“s”的前面)
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(367) : error C2059: 語(yǔ)法錯(cuò)誤 : “)”
2.總結(jié)一下常用MySQL命令:
測(cè)試環(huán)境:MySQL 5.1.35 安裝MySQL之后,打開MySQL Command Line Client,輸入root密碼,即可操作數(shù)據(jù)庫(kù) //查看MySQL版本 mysql> select version(); //顯示所有數(shù)據(jù)庫(kù) mysql> show databases; //使用數(shù)據(jù)庫(kù) mysql> use database_name; //顯示所有數(shù)據(jù)表 mysql> show tables; //顯示數(shù)據(jù)表結(jié)構(gòu) mysql> describe table_name; //創(chuàng)建數(shù)據(jù)庫(kù) mysql> create database database_name; //刪除數(shù)據(jù)庫(kù) mysql> drop database database_name; //創(chuàng)建數(shù)據(jù)表 mysql> use database_name; mysql> create table table_name (字段名 VARCHAR(20), 字段名 CHAR(1)); //刪除數(shù)據(jù)表 mysql> drop table table_name; //查詢記錄 mysql> select * from table_name; //導(dǎo)入.sql文件 mysql> use database_name; mysql> source c:/mysql.sql //修改root密碼 mysql> UPDATE mysql.user SET password=PASSWORD('新密碼') WHERE User='root'; //退出 mysql> quit
總結(jié)
到此這篇關(guān)于C/C++連接MySQL數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)C/C++連接MySQL數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解
下面小編就為大家?guī)?lái)一篇C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01c語(yǔ)言枚舉類型enum的用法及應(yīng)用實(shí)例
enum是C語(yǔ)言中的一個(gè)關(guān)鍵字,enum叫枚舉數(shù)據(jù)類型,枚舉數(shù)據(jù)類型描述的是一組整型值的集合,這篇文章主要給大家介紹了關(guān)于c語(yǔ)言枚舉類型enum用法及應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-07-07C語(yǔ)言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過(guò)問(wèn)題及解決
這篇文章主要介紹了C語(yǔ)言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過(guò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)快速排序
快速排序是一種不穩(wěn)定排序,這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)快速排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01