二、数据库与vs连接的步骤
1、调用mysql_library_init() 初始化MySQL C API库
2、调用mysql_init() 获取或初始化MYSQL结构
3、调用mysql_options() 连接前设置选项
4、调用mysql_real_connect() 连接到MySQL服务器
5、调用mysql_real_query() 执行指定长度的SQL语句(嵌入式SQL)
6、调用mysql_close() 关闭与服务器的连接
7、调用mysql_library_end() 终止MySQL C API库
三、代码实现
1.初始化MySQL C API数据库 MySQLCAPI::MySQLCAPI() { //1、调用mysql_library_init() 初始化MySQL C API库 if (mysql_library_init(0, nullptr, nullptr)) { //如果初始化MySQL C API库失败则返回非0值,否则成功返回0 cout << "初始化MySQL C API库失败!" << endl; getchar(); exit(1); //退出程序 } //2、调用mysql_init() 获取或初始化MYSQL结构 if (mysql_init(&mysql) == nullptr) { //如果获取或初始化MYSQL结构失败则返回null cout << "获取或初始化MYSQL结构失败!" << endl; getchar(); exit(1); //退出程序 } //3、调用mysql_options() 连接前设置选项 if (mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk")) { //连接前设置选项,并设置字符集为"gbk" cout << "连接前设置选项失败!" << endl; getchar(); exit(1); //退出程序 } }
2.数据库连接函数
bool MySQLCAPI::OpenConnect(const char* host, const char* username, const char* pwd, const char* db_name, unsigned port) { //4、调用mysql_real_connect() 连接到MySQL服务器 if (mysql_real_connect(&mysql, host, username, pwd, db_name, port, nullptr, 0) == nullptr) { cout << "连接到MySQL服务器失败!" << endl; //getchar(); //exit(1); //退出程序 GetErrorinfo(); //获取错误信息函数 return false; } return true; }
3.执行SQl操作
bool MySQLCAPI::ExecuteSQL(const char* sql) { //5、调用mysql_real_query() 执行指定长度的SQL语句(嵌入式SQL) if (mysql_real_query(&mysql, sql, strlen(sql))) { GetErrorinfo(); return false; } return true; }
4.执行SQL查询
//执行SQL查询(有结果集返回) bool MySQLCAPI::QuerySQL(const char* sql, vector<vector<string>>& resultSet) { //① 执行SQL语句 //5、调用mysql_real_query() 执行指定长度的SQL语句(嵌入式SQL) if (mysql_real_query(&mysql, sql, strlen(sql))) { GetErrorinfo(); return false; } //② 接收查询结果集 MYSQL_RES* result = mysql_store_result(&mysql); //定义一个数据库结果集对象来获取查询结果集 //③ 把结果集对象result中的数据放入vector中 unsigned rows = (unsigned)mysql_num_rows(result); //获取结果集对象的行数,也就是记录(元组)的条数 unsigned fields = (unsigned)mysql_num_fields(result); //获取结果集对象的列数,也就是属性(字段)的个数 MYSQL_ROW row; //定义一个数据库行对象 while (row = mysql_fetch_row(result)) { //循环变量结果集中的每一行 vector<string> linedata; //定义一个行数组 for (unsigned i = 0; i < fields; i++) { if (row[i]) { linedata.push_back(row[i]); //数据不为空时,把数据放入临时数组中 } else { linedata.push_back(""); //数据为空时,把空字符串放入临时数组中 } } resultSet.push_back(linedata); //把结果集中的每一行数据放入resultSet中 } mysql_free_result(result); //释放临时结果集 return true; }
5.关闭数据库连接
MySQLCAPI::~MySQLCAPI() { //6、调用mysql_close() 关闭与服务器的连接 mysql_close(&mysql); //7、调用mysql_library_end() 终止MySQL C API库 mysql_library_end(); }
四.源代码呈现
1.类(头文件)
#pragma once #include "mysql.h" //包含MySQL数据库功能函数头文件 #pragma comment(lib,"libmysql.lib") //包含MySQL连接静态库 #include <string> using std::string; #include <vector> using std::vector; //1、调用mysql_library_init() 初始化MySQL C API库 //2、调用mysql_init() 获取或初始化MYSQL结构 //3、调用mysql_options() 连接前设置选项 //4、调用mysql_real_connect() 连接到MySQL服务器 //5、调用mysql_real_query() 执行指定长度的SQL语句(嵌入式SQL) //6、调用mysql_close() 关闭与服务器的连接 //7、调用mysql_library_end() 终止MySQL C API库 class MySQLCAPI { MYSQL mysql; //mysql连接变量:用于连接mysql数据库 public: MySQLCAPI(); ~MySQLCAPI(); int errornum; //错误码 string errorinfo; //错误提示信息 //数据库连接函数 bool OpenConnect(const char* host, const char* username, const char* pwd, const char* db_name, unsigned port = 0); //获取错误信息函数 void GetErrorinfo(); //执行SQL操作(没有结果集返回) bool ExecuteSQL(const char* sql); //执行SQL查询(有结果集返回) bool QuerySQL(const char* sql, vector<vector<string>>& resultSet); };
2.类(cpp文件实现头文件功能)
#define _CRT_SECURE_NO_WARNINGS 1 #include "MySQLCAPI.h" #include <iostream> #include <string> using namespace std; MySQLCAPI::MySQLCAPI() { //1、调用mysql_library_init() 初始化MySQL C API库 if (mysql_library_init(0, nullptr, nullptr)) { //如果初始化MySQL C API库失败则返回非0值,否则成功返回0 cout << "初始化MySQL C API库失败!" << endl; getchar(); exit(1); //退出程序 } //2、调用mysql_init() 获取或初始化MYSQL结构 if (mysql_init(&mysql) == nullptr) { //如果获取或初始化MYSQL结构失败则返回null cout << "获取或初始化MYSQL结构失败!" << endl; getchar(); exit(1); //退出程序 } //3、调用mysql_options() 连接前设置选项 if (mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk")) { //连接前设置选项,并设置字符集为"gbk" cout << "连接前设置选项失败!" << endl; getchar(); exit(1); //退出程序 } } MySQLCAPI::~MySQLCAPI() { //6、调用mysql_close() 关闭与服务器的连接 mysql_close(&mysql); //7、调用mysql_library_end() 终止MySQL C API库 mysql_library_end(); } //数据库连接函数 bool MySQLCAPI::OpenConnect(const char* host, const char* username, const char* pwd, const char* db_name, unsigned port) { //4、调用mysql_real_connect() 连接到MySQL服务器 if (mysql_real_connect(&mysql, host, username, pwd, db_name, port, nullptr, 0) == nullptr) { cout << "连接到MySQL服务器失败!" << endl; //getchar(); //exit(1); //退出程序 GetErrorinfo(); //获取错误信息函数 return false; } return true; } //获取错误信息函数 void MySQLCAPI::GetErrorinfo() { errornum = mysql_errno(&mysql); //获取错误码 errorinfo = mysql_error(&mysql); //获取错误提示信息 cout << "\nerror num:" << errornum << "\nerror info:" << errorinfo << endl; getchar(); } //执行SQL操作(没有结果集返回) bool MySQLCAPI::ExecuteSQL(const char* sql) { //5、调用mysql_real_query() 执行指定长度的SQL语句(嵌入式SQL) if (mysql_real_query(&mysql, sql, strlen(sql))) { GetErrorinfo(); return false; } return true; } //执行SQL查询(有结果集返回) bool MySQLCAPI::QuerySQL(const char* sql, vector<vector<string>>& resultSet) { //① 执行SQL语句 //5、调用mysql_real_query() 执行指定长度的SQL语句(嵌入式SQL) if (mysql_real_query(&mysql, sql, strlen(sql))) { GetErrorinfo(); return false; } //② 接收查询结果集 MYSQL_RES* result = mysql_store_result(&mysql); //定义一个数据库结果集对象来获取查询结果集 //③ 把结果集对象result中的数据放入vector中 unsigned rows = (unsigned)mysql_num_rows(result); //获取结果集对象的行数,也就是记录(元组)的条数 unsigned fields = (unsigned)mysql_num_fields(result); //获取结果集对象的列数,也就是属性(字段)的个数 MYSQL_ROW row; //定义一个数据库行对象 while (row = mysql_fetch_row(result)) { //循环变量结果集中的每一行 vector<string> linedata; //定义一个行数组 for (unsigned i = 0; i < fields; i++) { if (row[i]) { linedata.push_back(row[i]); //数据不为空时,把数据放入临时数组中 } else { linedata.push_back(""); //数据为空时,把空字符串放入临时数组中 } } resultSet.push_back(linedata); //把结果集中的每一行数据放入resultSet中 } mysql_free_result(result); //释放临时结果集 return true; }
3.源程序文件
#include <iostream> #include <string> using namespace std; #include "MySQLCAPI.h" void MySQLConnectTest(); int main() { MySQLConnectTest(); system("pause"); return 0; } void MySQLConnectTest() { MySQLCAPI MySQL_Connect; MySQL_Connect.OpenConnect("localhost", "root", "123456", "db_2"); string sql = "use db_2;"; vector<vector<string>> data; MySQL_Connect.ExecuteSQL(sql.c_str()); //sql = "insert into db_2.student values(null,\"����\",103,'��',24);"; //MySQL_Connect.ExecuteSQL(sql.c_str()); sql = "select * from db_2.student;"; MySQL_Connect.QuerySQL(sql.c_str(), data); for (unsigned i = 0; i < data.size(); i++) { for (unsigned j = 0; j < data[i].size(); j++) { cout << data[i][j] << '\t'; } cout << endl; } }
总结
数据库与VS的连接类容就到此结束了,我们的数据库知识点也讲解的差不多了,后面就是MySQL数据库的题目讲解了。也会持续更新win32和mfc。如果有需要,可以关注博主一下哦。