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

开发环境

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

实现二运行结果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值