??????? 使用vs2019對window11中的數(shù)據(jù)庫進(jìn)行連接
1. 配置連接環(huán)境
??????? 首先需要把mysql中的頭文件和庫文件放入到c++項(xiàng)目工程中
1.打開安裝MySQL的目錄,在windows系統(tǒng)中如果是默認(rèn)路徑,應(yīng)該和我的是一樣的:C:\Program Files\MySQL\MySQL Server 8.0
2.找到include,和lib文件,include文件是包含的頭文件,lib文件是包含的庫文件
?3.在創(chuàng)建的c++工程中加入include,lib文件路徑,按一下步驟
??????? 1.工程中的項(xiàng)目找到屬性
??????? 2.到 VC++ 目錄 中的包含目錄和庫目錄分別加入include文件和lib文件的路徑,
??????????????? 這是我的路徑:include文件路徑:C:\Program Files\MySQL\MySQL Server 8.0\include
???????????????????????????????????????? lib文件路徑:C:\Program Files\MySQL\MySQL Server 8.0\lib
?????????3. 到 鏈接器 中的 輸入 中的 附加依賴項(xiàng)中 加入 libmysql.lib 的依賴:
???????? 4.還需要把下圖中的 libmysql.dll 的文件復(fù)制到 C:\Windows\System32 目錄中
?
連接mysql可以參考 mysql參考手冊 進(jìn)行查看
2.代碼實(shí)現(xiàn)連接
??????? 1. mysql_read_connect函數(shù),連接成功會(huì)返回MYSQL*連接句柄,返回得值與第一個(gè)參數(shù)得值相同,連接失敗返回一個(gè)null:
mysql_real_connect(
MYSQL *mysql, ///< 數(shù)據(jù)庫句柄
const char *host, ///< 主機(jī)名
const char *user, ///< 用戶名
const char *passwd,///< 密碼
const char *db, ///< 數(shù)據(jù)庫名
unsigned int port, ///< 端口號(MySQL為3306)
const char *unix_socket,///< unix_socket–unix連接方式,為NULL時(shí)表示不使用socket或管道機(jī)制
unsigned long clientflag ///< clientflag–Mysql運(yùn)行為ODBC數(shù)據(jù)庫的標(biāo)記,一般取0
);
??????? 例子:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<mysql.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int sr;
srand((unsigned)time(NULL));
sr = rand() % 50 + 1;
//固定不變的
MYSQL mysql; //一個(gè)數(shù)據(jù)庫結(jié)構(gòu)體
MYSQL_RES* res; //一個(gè)結(jié)果集結(jié)構(gòu)體
MYSQL_ROW row; //char** 二維數(shù)據(jù),存放一條條記錄
//初始化數(shù)據(jù)庫
mysql_init(&mysql);
//設(shè)置編碼方式
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
//連接數(shù)據(jù)庫 //ip地址 //用戶名 //密碼 //數(shù)據(jù)庫名
if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
{
printf("錯(cuò)誤原因:%s\n", mysql_error(&mysql));
printf("連接失敗\n");
exit(-1);
}
//往數(shù)據(jù)庫中插入一個(gè)隨機(jī)數(shù)
char* str1 = "insert into rand values(";
char sql_insert[200];
sprintf(sql_insert, "%s%d%s", str1, sr, ")");
mysql_query(&mysql, sql_insert); //sql語句提交
//查詢數(shù)據(jù)
mysql_query(&mysql, "select * from rand");
//獲取結(jié)果集
res = mysql_store_result(&mysql);
//給ROW賦值,判斷ROW是否為空,不為空就打印數(shù)據(jù)
while (row = mysql_fetch_row(res))
{
printf("%s\n", row[0]);
}
//釋放結(jié)果集
mysql_free_result(res);
//關(guān)閉數(shù)據(jù)庫
mysql_close(&mysql);
//停留等待
system("pause");
return 0;
}
??????? 使用c++語句對數(shù)據(jù)庫進(jìn)行增刪改查,在使用c++中string類型時(shí),需要把string類型轉(zhuǎn)換為c中的類型,使用mysql_query函數(shù)把sql語句提交,查詢成功返回0,結(jié)果會(huì)被保存到mysql對象中,查詢失敗會(huì)返回非0值:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<mysql.h>
#include<string>
using namespace std;
int main()
{
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;
mysql_init(&mysql);
if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
{
printf("錯(cuò)誤提示:%s\n", mysql_error(&mysql));
printf("連接失敗\n");
}
//設(shè)置字符集
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
string str1 = "alter table tb_77 modify sex varchar(20);";//修改表類型失敗
mysql_query(&mysql, str1.c_str());
string str = "insert into tb_77 values(5,'sdmqy','h');";//增加數(shù)據(jù)成功,不可以增加漢字
mysql_query(&mysql, str.c_str());
printf("%s", str.c_str());
string str2 = "delete from tb_77 where sex = '女';";//刪除數(shù)據(jù)成功
mysql_query(&mysql, str2.c_str());
string str3 = "update tb_77 set name = 'ttb' where id = 2;";//更改也行
mysql_query(&mysql, str3.c_str());
mysql_close(&mysql);
return 0;
}
??????? 各個(gè)類說明:
1.? mysql句柄類
1 | MYSQL mysql; |
??????? 該類在c++中操作數(shù)據(jù)庫都要使用到
2.MYSQL_RES查詢結(jié)果集
2 | MYSQL_RES * res=nullptr; |
??????? 用來保存查詢到的所有結(jié)果
3.MYSQL_ROW獲取結(jié)果集中的內(nèi)容
3. | MYSQL_ROW row |
??????? 該變量可以獲取到結(jié)果集中的數(shù)據(jù),并且輸出
4.獲取查詢結(jié)果集
1 | mysql_store_result(查詢結(jié)果集變量) |
2 | mysql_use_result(查詢結(jié)果集變量) |
??????? 第一種調(diào)用mysql_store_result(查詢結(jié)果集變量),把mysql數(shù)據(jù)庫中指定的表的數(shù)據(jù)全部進(jìn)行保存,把服務(wù)端得數(shù)據(jù)保存到客戶端
??????? 第二種調(diào)用mysql_use_result(查詢結(jié)果集變量),初始化檢索,方便后面一行一行讀取結(jié)果集,速度快,占用內(nèi)存少,但是會(huì)阻止其它線程使用,
5.讀取結(jié)果集
1 | mysql_fetch_row(查詢結(jié)果集) |
??????? 從結(jié)果集中獲取到一行數(shù)據(jù),有數(shù)據(jù)保存改行的每個(gè)字段值,沒有返回一個(gè)null
3.一些函數(shù)說明
??????? 1.mysql_num_fields(MYSQL_RES*)
??????????????? 該函數(shù)可以拿表中的列數(shù),返回值是一個(gè)unsigned類型
??????? 2.mysql_fetch_fields(MYSQL_RES*)
??????????????? 該函數(shù)可以拿到表中每一列的字段名,返回的是一個(gè)結(jié)構(gòu)體數(shù)組
??????? 3.mysql_fetch_lengths(MYSQL_RES*)
??????????????? 該函數(shù)拿到行中每一列的字段長度,返回結(jié)果是一個(gè)unsigned類型
??????? 4.mysql_free_result(MYSQL_RES*)
??????????????? 該函數(shù)釋放結(jié)果集
??????? 5.事務(wù)設(shè)置:
??????? 在mysql中事務(wù)是默認(rèn)自動(dòng)提交的,如果需要提交的事務(wù)多,對我們的操作會(huì)有影響,所以需要設(shè)置事務(wù)為手動(dòng)提交
- mysql_autocommit(MYSQL* , mode)? 設(shè)置事務(wù)是否自動(dòng)提交函數(shù)
??????? 參數(shù):mode如果為“1”,自動(dòng)提交,為“0”為手動(dòng)提交?? 返回值:提交成功返回0,否則返回非0
- mysql_commit(MYSQL* mysql)? 事務(wù)提交函數(shù)
??????? 返回值:成功返回0,否則返回非0
- mysql_rollback(MYSQL* mysql)? 事務(wù)回滾函數(shù)
??????? 返回值:成功返回0,否則返回非0
??????? 6.打印錯(cuò)誤信息:文章來源:http://www.zghlxwxcb.cn/news/detail-431927.html
- const char* mysql_error(MYSQL* mysql):返回錯(cuò)誤信息的描述
- const char* mysql_errno(MYSQL* mysql):返回錯(cuò)誤的編號
代碼使用的例子文章來源地址http://www.zghlxwxcb.cn/news/detail-431927.html
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<mysql.h>
using namespace std;
int main()
{
//創(chuàng)建句柄
MYSQL mysql;
//創(chuàng)建數(shù)據(jù)集變量
MYSQL_RES* res = nullptr;
//創(chuàng)建結(jié)果集變量
MYSQL_ROW row;
//創(chuàng)建一個(gè)結(jié)構(gòu)體
MYSQL_FIELD* field;
//初始化數(shù)據(jù)庫句柄
mysql_init(&mysql);
//設(shè)置字符集
//mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
mysql_set_character_set(&mysql, "gbk");
//開始連接數(shù)據(jù)庫
if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0))
{
cout << "連接成功" << endl;
}
else
{
cout << "連接失敗" << endl;
return 0;
}
//設(shè)置事務(wù)
mysql_autocommit(&mysql, "1");
//增加數(shù)據(jù)
string str1 = "insert into tb_912 values(2, 'xiaoming', '李四');";
char ssql[1024];
//使用sprintf拼出來的語句是一個(gè)標(biāo)準(zhǔn)的c語言字符串,可以使用該函數(shù)插入變量值
sprintf(ssql, "insert into tb_912 values(%d, '%s', '%s');", 3, "daming", "17777777772");
if (mysql_query(&mysql, ssql))//該語句提交成功返回0,失敗放回1
{
cout << "提交失敗" << endl;
}
else
{
cout << "提交成功" << endl;
}
//提交語句
mysql_query(&mysql, str1.c_str());
//刪除數(shù)據(jù)
string str3 = "delete from tb_912 where id = 2;";
mysql_query(&mysql, str3.c_str());
//修改數(shù)據(jù)
string str4 = "update tb_912 set name = '張三' where id = 1;";
mysql_query(&mysql, str4.c_str());
//查詢數(shù)據(jù)
string str2 = "select * from tb_912;";
mysql_query(&mysql, str2.c_str());
//事務(wù)提交
mysql_commit(&mysql);
//獲取里面的結(jié)果集
res = mysql_store_result(&mysql);
//拿到結(jié)果集得列數(shù),調(diào)用的是 mysql_store_result() 的返回值,
unsigned int a = mysql_num_fields(res);
cout <<"表得列數(shù):"<< a << endl;
//使用 mysql_fetch_fields() 函數(shù)獲取列的名字,返回的是一個(gè)結(jié)構(gòu)體數(shù)組
field = mysql_fetch_fields(res);
for (unsigned i = 0; i < a; i++)
{
cout << "當(dāng)前列的名字:" << field[i].name << endl;//取出名字
}
unsigned long* lengths;
//從結(jié)果集中獲取到數(shù)據(jù) mysql_fetch_row() 獲取結(jié)果集中的一行數(shù)據(jù),
//成功:返回記錄當(dāng)前行中每個(gè)字段的值,失?。悍祷匾粋€(gè)null
while (row = mysql_fetch_row(res))
{
printf("%s %s %s \n", row[0], row[1], row[2]);
//獲取列中字段的長度
lengths = mysql_fetch_lengths(res);//返回的是一個(gè)數(shù)組地址
for (unsigned int i = 0; i < a; i++)
{
cout << "當(dāng)前列的長度:" << lengths[i] << endl;//列數(shù)會(huì)構(gòu)成一個(gè)數(shù)組
}
}
//釋放結(jié)果集
mysql_free_result(res);
//關(guān)閉mysql實(shí)例
mysql_close(&mysql);
return 0;
}
到了這里,關(guān)于c++ 連接mysql數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!