您的位置:首页 > 编程语言 > C语言/C++

[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;
}

实现二运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: