C/C++連接MySQL數(shù)據(jù)庫詳細(xì)圖文教程
一.準(zhǔn)備工作
要使用C語言連接mysql,需要使用mysql官網(wǎng)提供的庫,大家可以去官網(wǎng)下載
我們使用C接口庫來進(jìn)行連接
要正確使用,我們需要做一些準(zhǔn)備工作:
- 保證mysql服務(wù)有效
- 在官網(wǎng)上下載合適自己平臺(tái)的mysql connect庫,以備后用
- 下載
命令:sudo yum install mysql-devel
二.Connector/C 使用
如果是直接到MySQL官網(wǎng)下載的庫,需要自己打包成庫使用,將生成的庫路徑寫入OS。
1.引入MySQL庫
mysql.c-api5.7function-reference
測(cè)試是否引入成功:
通過 mysql_get_client_info() 函數(shù),來驗(yàn)證我們的引入是否成功;

#include <iostream>
#include </usr/include/mysql/mysql.h>
// 頭文件路徑+庫文件路徑+庫名
//-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)找不到文件,就將完整的庫文件路徑,頭文件路徑指定清楚:
g++ -o test test.cc -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient
至此引入庫的工作已經(jīng)做完,接下來就是熟悉接口.
2.mysql接口介紹
初始化mysql_init():
要使用庫,必須先進(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ù)庫mysql_real_connect:
初始化完畢之后,必須先鏈接數(shù)據(jù)庫,在進(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ù)庫連接成功以后的各種數(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>
// 頭文件路徑+庫文件路徑+庫名
//-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)介紹過,第二個(gè)參數(shù)為要執(zhí)行的sql語句。
測(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í)行完以后,如果是查詢語句,我們當(dāng)然還要讀取數(shù)據(jù),如果update,insert等語句,那么就看下操作成功與否即可。我們來看看如何獲取查詢結(jié)果: 如果mysql_query返回成功,那么我們就通過mysql_store_result這個(gè)函數(shù)來讀取結(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ù)指針來獲取查詢的結(jié)果。同時(shí)該函數(shù)會(huì)返回MYSQL_RES 這樣一個(gè)變量,該變量主要用于保存查詢的結(jié)果。同時(shí)該函數(shù)malloc了一片內(nèi)存空間來存儲(chǔ)查詢過來的數(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>
// 頭文件路徑+庫文件路徑+庫名
//-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庫引入
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ù)等常用操作,大家下來自行了解:
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: 語法錯(cuò)誤 : 缺少“;”(在標(biāo)識(shí)符“fd”的前面)
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認(rèn) int
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C4430: 缺少類型說明符 - 假定為 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: 語法錯(cuò)誤 : 缺少“)”(在標(biāo)識(shí)符“s”的前面)
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(367) : error C2059: 語法錯(cuò)誤 : “)”
2.總結(jié)一下常用MySQL命令:
測(cè)試環(huán)境:MySQL 5.1.35
安裝MySQL之后,打開MySQL Command Line Client,輸入root密碼,即可操作數(shù)據(jù)庫
//查看MySQL版本
mysql> select version();
//顯示所有數(shù)據(jù)庫
mysql> show databases;
//使用數(shù)據(jù)庫
mysql> use database_name;
//顯示所有數(shù)據(jù)表
mysql> show tables;
//顯示數(shù)據(jù)表結(jié)構(gòu)
mysql> describe table_name;
//創(chuàng)建數(shù)據(jù)庫
mysql> create database database_name;
//刪除數(shù)據(jù)庫
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ù)庫的文章就介紹到這了,更多相關(guān)C/C++連接MySQL數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解
下面小編就為大家?guī)硪黄狢語言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解。小編覺得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
c語言枚舉類型enum的用法及應(yīng)用實(shí)例
enum是C語言中的一個(gè)關(guān)鍵字,enum叫枚舉數(shù)據(jù)類型,枚舉數(shù)據(jù)類型描述的是一組整型值的集合,這篇文章主要給大家介紹了關(guān)于c語言枚舉類型enum用法及應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-07-07
C語言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過問題及解決
這篇文章主要介紹了C語言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

