一、开发环境

vs2019 debug/release x64

二、相关文件和库

mysql自带的include目录下的文件 和 lib目录下的库文件
include文件地址
lib文件地址

三、导入头文件和库文件

在这里插入图片描述
附加依赖项里添加libmysql.lib

四、把lib目录下的libmysql.dll放到exe同目录下

在这里插入图片描述

五、代码

SimpleDb.h


#pragma once
#include<string>
#include<vector>
#include"include/mysql.h"

struct SField
{
	std::string			  strValue;				
	bool				  bIsNull{ false };		
	enum_field_types	  eType { MYSQL_TYPE_NULL }; //字段类型
};

class CSimpleDb
{
public:
	CSimpleDb( std::string strHost,int nPort,
		std::string strUser,
		std::string strPassWord,
		std::string strDb);
	~CSimpleDb();
	bool Connected();
	bool Query(std::string strSQL, std::vector<std::vector<SField>> &vecRes);
private:
	MYSQL*		m_pMysql{ nullptr };
	std::string m_strHost;
	std::string m_strUser;
	std::string m_strPassWord;
	std::string m_strDb;
	int			m_nPort;
};

SimpleDb.cpp

#include"SimpleDb.h"
#include<iostream>

CSimpleDb::CSimpleDb(
	std::string strHost, int nPort,
	std::string strUser,
	std::string strPassWord,
	std::string strDb
):m_strHost(strHost),m_strUser(strUser),m_strPassWord(strPassWord),m_strDb(strDb), m_nPort(nPort)
{
	m_pMysql = mysql_init(nullptr);

	//mysql_options(m_pMysql, MYSQL_SET_CHARSET_NAME,"gbk");
}

bool CSimpleDb::Connected()
{
	//对于成功的连接,返回值与第一个参数的值相同
	auto p = mysql_real_connect(m_pMysql, m_strHost.c_str(), m_strUser.c_str(), m_strPassWord.c_str(), m_strDb.c_str(), m_nPort
		, nullptr, 0);

	if (nullptr == p)
	{
		std::cout << mysql_error(m_pMysql) << std::endl;
		return false;
	}
	return true; 
}

bool CSimpleDb::Query(std::string strSQL, std::vector<std::vector<SField>>& vecRes)
{
	vecRes.clear();

	const int nRet = mysql_query(m_pMysql, strSQL.c_str());
	do
	{
		if (0 != nRet)
			break;

		MYSQL_RES* res = mysql_store_result(m_pMysql);

		if (nullptr == res && 0 == mysql_field_count(m_pMysql))
			break;

		const uint64_t	n64Rows		= mysql_num_rows(res);
		const unsigned	nFields		= mysql_num_fields(res);
		MYSQL_FIELD *	arrFields	= mysql_fetch_fields(res);

		for (unsigned i = 0; i < nFields; i++)
		{
			std::cout << arrFields[i].name << "," << arrFields[i].type << "," << arrFields[i].length << "\t";
		}
		std::cout << std::endl;

		vecRes.resize(n64Rows);
		for (uint64_t i = 0; i < n64Rows; i++)
		{
			vecRes[i].resize(nFields);
			auto& vecField = vecRes[i];

			MYSQL_ROW row = mysql_fetch_row(res);
			for (unsigned j = 0; j < nFields; j++)
			{
				auto &sField	= vecField[j];
				sField.bIsNull	= nullptr == row[j];
				sField.eType	= arrFields[i].type;
				if (nullptr != row[j])
					sField.strValue += row[j];
				else
					sField.strValue = "null";

				std::cout << sField.strValue << "\t";
			}
			std::cout << std::endl;
		}

		mysql_free_result(res);
		return true;

	} while (false);
	
	const char* pError = mysql_error(m_pMysql);
	if (nullptr != pError && strlen(pError) > 0)
	{
		std::cout << pError << std::endl;
		return false;
	}
	return true;
}

CSimpleDb::~CSimpleDb()
{
	if (nullptr != m_pMysql)
	{
		mysql_close(m_pMysql);
	}
}

main.cpp

//
#include <iostream>
#include "SimpleDb.h"

int main()
{
   
    CSimpleDb ss("IP",端口, "用户", "密码", "数据库");

    bool bConnected = ss.Connected();

    std::vector<std::vector<SField>> vecRes;

    bool bSucc = ss.Query("SELECT * FROM db_test.single_table", vecRes);

    std::string strSQL = "insert into db_test.single_table(key1,key2,key3,key_part1,key_part2,key_part3,commom_field)\
                            values('', '10', '8', '9', '5', '6', '90')";

    bSucc = ss.Query(strSQL, vecRes);
    return 0;
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐