[C/C++]硬货 数据库开发之mysql

来源:互联网 发布:科比勤奋 知乎 编辑:程序博客网 时间:2024/06/13 09:00

开发环境

Windows 10专业版  64位操作系统
Visual Studio 2017  版本15.4.0
Microsoft .NET Framework  版本 4.7.02046
mysql-5.7.19-winx64.zip

VS数据库开发配置

1、创建项目 文件-新建-项目 如图:

2、打开项目属性页 配置管理器 - 活动解决方案平台选择x64,如图:

3、配置mysql头文件 属性-连接器-常规-附加库目录,选择mysql安装目录/include目录(我的路径:E:\mywork\mysql-5.7.19-winx64\include),如图:

4、配置libmysql.lib依赖,属性-连接器-输入-附加依赖项,添加libmysql.lib,如图:


4-2、属性-VC++目录-常规-库目录 加入lib目录(E:\mywork\mysql-5.7.19-winx64\lib),如图:

5、添加附加包含目录,属性-C/C++-常规,选择mysql项目目录/lib和mysql项目目录/include(E:\mywork\mysql-5.7.19-winx64\lib,E:\mywork\mysql-5.7.19-winx64\include),如图:


注意:如果没有找到C/C++选项,不怕,项目创建一个.cpp文件就能解决
6、把E:\mywork\mysql-5.7.19-winx64\lib目录下的libmysql.dll拷贝到vs项目根目录或DEBUG目录,如图:

7、调试-选项-常规 选中启用源服务支持,如图:

8、调试-选项-常规 选中Microsoft 符号服务器,如图:



实现方式一:

MysqlDB.h
#ifndef __MYSQLDB_H__#define __MYSQLDB_H__ #include <Windows.h>#include <mysql.h>using namespace std;class MysqlDB{public:MysqlDB();~MysqlDB();int initDB(char* host, char* user, char* pwd, char* dbname);int query(char* sql);private:MYSQL *conn;MYSQL_ROW row;MYSQL_RES *res;MYSQL_FIELD *fields;};#endif

MysqlDB.cpp
#include "MysqlDB.h"#include <iostream>#include <string>using namespace std;MysqlDB::MysqlDB(){// 初始化数据库连接变量conn = mysql_init(NULL);if (conn == NULL){cout << "error: " << mysql_error(conn) << endl;exit(1);}}MysqlDB::~MysqlDB(){if (conn != NULL){mysql_close(conn);}}int MysqlDB::initDB(char* host, char* user, char* pwd, char* dbname){// 访问数据库conn = mysql_real_connect(conn, host, user, pwd, dbname, 0, NULL, 0);if (conn == NULL){cout << "数据库连接失败: " << mysql_errno(conn) << ", " << mysql_error(conn) << endl;return -1;}cout << "数据库连接成功" << endl;return 0;}int MysqlDB::query(char* sql) {mysql_query(conn, "set names gbk");int flag = mysql_real_query(conn, sql, (unsigned long)strlen(sql));if (flag){cout << "查询出错: " << mysql_errno(conn) << ", " << mysql_error(conn) << endl;return -1;}// res = mysql_store_result(conn); // 将查询结果读取到内存中 如果数据很多的情况会比较耗内存 res = mysql_use_result(conn); // 需要用到的时候,每次从服务器中读取一行    // 获取结果集中所有字段fields = mysql_fetch_fields(res);// 字段数量int field_count = mysql_field_count(conn);// 查询总数my_ulonglong rows = mysql_num_rows(res);// 获取所有字段for (int i = 0; i < field_count; i++){cout << fields[i].name << "\t";}cout << endl;// 遍历结果集的每一行数据while (row = mysql_fetch_row(res)){for (int i = 0; i < field_count; i++){cout << row[i] << "\t";}cout << endl;}// 释放结果集mysql_free_result(res);return 0;}

main.cpp
#include "MysqlDB.h"int main(){MysqlDB db;db.initDB("192.168.3.13", "root", "123456", "test");db.query("select * from teacher");system("pause");return 0;}


运行结果



实现方式二:

MysqlDB.h
#ifndef __MYSQLDB_H__#define __MYSQLDB_H__ #include <Windows.h>#include <string>#include <mysql.h>#include <vector>using namespace std;class MysqlDB{public:~MysqlDB();MysqlDB(string host, string user, string pwd, string dbname);int initDB();int query(string sql);vector<vector<string>> getQueryResult();int insert(string sql);protected:void setHost(string host);void setUser(string user);void setPwd(string pwd);void setDbname(string dbname);private:MYSQL connector;MYSQL_ROW row;MYSQL_RES *res;vector<vector<string>> m_vvQueryResult;bool m_bConnected;char* m_cpHost;char* m_cpUser;char* m_cpPwd;char* m_cpDbname;};#endif // __MYSQLDB_H__

MysqlDB.cpp
#include "MysqlDB.h"#include <iostream>#include <string>#include <string.h>#include <vector>using namespace std;MysqlDB::~MysqlDB(){if (&connector != NULL){mysql_close(&connector);m_bConnected = false;}}MysqlDB::MysqlDB(string host, string user, string pwd, string dbname){// 初始化和验证参数m_bConnected = false;this->setHost(host);this->setUser(user);this->setPwd(pwd);this->setDbname(dbname);}void MysqlDB::setHost(string host){if (host.empty()){cout << "没有指定主机地址,默认:localhost" << endl;this->m_cpHost = new char[10];strcpy_s(this->m_cpHost, 10, "localhost");}else {this->m_cpHost = new char[strlen(host.c_str()) + 1];strcpy_s(this->m_cpHost, strlen(host.c_str()) + 1, host.c_str());}}void MysqlDB::setUser(string user){if (user.empty()){cout << "没有指定数据库用户名,默认:root" << endl;this->m_cpUser = new char[5];strcpy_s(this->m_cpUser, 5, "root");}else {this->m_cpUser = new char[strlen(user.c_str()) + 1];strcpy_s(this->m_cpUser, strlen(user.c_str()) + 1, user.c_str());}}void MysqlDB::setPwd(string pwd){if (pwd.empty()){cout << "没有指定数据库密码,默认:123456" << endl;this->m_cpPwd = new char[7];strcpy_s(this->m_cpPwd, 7, "123456");}else {this->m_cpPwd = new char[strlen(pwd.c_str()) + 1];strcpy_s(this->m_cpPwd, strlen(pwd.c_str()) + 1, pwd.c_str());}}void MysqlDB::setDbname(string dbname){if (dbname.empty()){cout << "没有指定数据库名称,默认地址:mysql" << endl;this->m_cpDbname = new char[6];strcpy_s(this->m_cpDbname, 6, "mysql");}else {this->m_cpDbname = new char[strlen(dbname.c_str()) + 1];strcpy_s(this->m_cpDbname, strlen(dbname.c_str()) + 1, dbname.c_str());}}int MysqlDB::initDB(){if (m_bConnected){cout << "已经连接到数据库" << endl;return 0;}// 初始化数据库连接变量mysql_init(&connector);// 访问数据库if (!mysql_real_connect(&connector, m_cpHost, m_cpUser, m_cpPwd, m_cpDbname, 0, NULL, 0)){cout << "数据库连接失败: " << mysql_errno(&connector) << ", " << mysql_error(&connector) << endl;return -1;}m_bConnected = true;return 0;}int MysqlDB::query(string sql) {if (!m_bConnected){cout << "没有连接到数据库" << endl;return -1;}if (sql.empty()){cout << "sql语句为空" << endl;return -1;}mysql_query(&connector, "set names gbk");int flag = mysql_real_query(&connector, sql.c_str(), (unsigned long)strlen(sql.c_str()));if (flag < 0){cout << "查询出错: " << mysql_errno(&connector) << ", " << mysql_error(&connector) << endl;return -1;}res = mysql_store_result(&connector); // 将查询结果读取到内存中 如果数据很多的情况会比较耗内存 //res = mysql_use_result(&connector); // 需要用到的时候,每次从服务器中读取一行  vector<string> objectValue;while ((row = mysql_fetch_row(res))){objectValue.clear();for (size_t i = 0; i < mysql_num_fields(res); i++){objectValue.push_back(row[i]);}this->m_vvQueryResult.push_back(objectValue);}// 释放结果集mysql_free_result(res);return 0;}int MysqlDB::insert(string sql){if (!m_bConnected){cout << "没有连接到数据库" << endl;return -1;}if (sql.empty()){cout << "sql语句为空" << endl;return -1;}int res = mysql_query(&connector, sql.c_str());if (res < 0){cout << "插入出错: " << mysql_errno(&connector) << ", " << mysql_error(&connector) << endl;return -1;}int rows = mysql_affected_rows(&connector);cout << "插入行:" << rows << " 成功" << endl;return rows;}vector<vector<string>> MysqlDB::getQueryResult(){return this->m_vvQueryResult;}
main.cpp
#include "MysqlDB.h"#include <vector>#include <iostream>using namespace std;int main(){MysqlDB db("192.168.3.13", "root", "123456", "test");db.initDB();db.insert("INSERT INTO `test`.`teacher` (`id`, `name`, `age`) VALUES (NULL, 'ZHAGNSAN2', '22');");//db.insert("UPDATE `test`.`teacher` SET `id`='1', `name`='xxxx22', `age`='22' WHERE (`id`='1')");//db.insert("DELETE FROM `test`.`teacher` where `id`='1'");db.query("select * from teacher");vector<vector<string>> result = db.getQueryResult();for (auto& vec : result){for (auto& str : vec){cout << str.c_str() << " ";}cout << endl;}system("pause");return 0;}

实现二运行结果




原创粉丝点击