[C/C++]硬货 数据库开发之mysql
2017-10-15 10:08
330 查看
开发环境
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; }
实现二运行结果
相关文章推荐
- 【数据库开发】如何创建MySQL数据库连接池(一个基于libmysql的MySQL数据库连接池示例(C/C++版))
- 【数据库开发】在Windows上利用C++开发MySQL的初步
- mfc vs2010 C++ 连接mysql等数据库
- Oracle数据库开发(三).Pro*C/C++的编译参数
- 【数据库开发】C++测试redis中的publish/subscribe
- 【MySQL数据库开发之一】Mac下配置安装数据库-MySQL
- 【数据库开发】在Windows上和Linux上配置MySQL的过程
- 【转】在sqlserver下增加MYSQL的链接服务器,实现分布式数据库开发第一步
- c++开发数据库
- MySQL 数据库开发的 36 条军规
- 云应用开发之新浪SAE读写云端数据库MySQL
- .Net+MySQL的开发(数据库访问)
- mysql c/c++语言程序开发
- windows数据库mysql安装及C++连接
- 数据库连接检查以及在c++中捕获mysql报出的错误
- 用Java开发的MySQL,Oracle,PostgreSQL数据库web维护管理软件
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第38讲:PHP数据库编程mysql
- Oracle数据库开发(三).Pro*C/C++的编译参数
- MySQL 数据库开发规范
- Yii Framework2.0开发教程(6)数据库mysql--ActiveRecord