C++访问MySQL数据

自己封装了一个CMySqlServer 类继承至基类ISimDataBase用于访问MySQL数据库,可扩展Oracle、SqlServer。在此做个记录,多多指教。

基类ISimDataBase:
isimdatabase.h文件

#ifndef _DATA_VISIT_BASE_H_
#define _DATA_VISIT_BASE_H_

#ifndef DB_API_EX_IM
#define DB_API_EX_IM_PORT __declspec(dllexport)
#else
#define DB_API_EX_IM_PORT __declspec(dllimport)
#endif

#include "EnumDef.h"
#include <vector>
#include <string>
using namespace std;

namespace SimDataBase
{
	class DB_API_EX_IM_PORT ISimDataBase
	{
	public:
		//连接DB
		virtual bool Connect(string strIP, string strDBname, string strUser, string strPwd) = 0;
		//获取数据存入容器中
		virtual long GetDatas(vector<vector<char*> > &datas, const char* sql) = 0;
		//转换数据类型
		//virtual bool GetDataByType(string &valStr, const _variant_t &value) = 0;
		//执行sql语句
		virtual long ExecuteSQL(const char* sql) = 0;
		//事务操作(多个sql语句)
		virtual long ExecuteSQLs(const vector<char*> &sqls) = 0;
		//初始化状态
		virtual bool GetState();
		//错误消息
		virtual string GetErrorMessage();
		//连接状态
		virtual int GetConnectionState() = 0;
		//设置连接参数
		static void SetConnectPram(const DBTYPE& DbType,const string& strIP,const string& strDBname, const string& strUser, const string& strPwd);
		//获取实例
		static ISimDataBase* GetInstance();

		virtual ~ISimDataBase();
	public:
		bool m_bState;
		string m_strErrorMessage;
		unsigned int m_unErrorCode;
	private:
		static ISimDataBase *m_pSimDataBase;
		static DBTYPE m_DbType;
		static string m_strIP;
		static string m_strDBname;
		static string m_strUser; 
		static string m_strPwd;
	};
}

#endif

ISimDataBase.cpp文件:

#include "StdAfx.h"
#include "ISimDataBase.h"
#include "DbFactory.h"

namespace SimDataBase
{
	ISimDataBase* ISimDataBase::m_pSimDataBase = NULL;
	DBTYPE ISimDataBase::m_DbType = DB_MYSQL;
	string ISimDataBase::m_strIP = "127.0.0.1";
	string ISimDataBase::m_strDBname = "MySql";
	string ISimDataBase::m_strUser = "root"; 
	string ISimDataBase::m_strPwd = "root";

	ISimDataBase::~ISimDataBase()
	{
		if (m_pSimDataBase)
		{
			delete m_pSimDataBase;
			m_pSimDataBase = NULL;
		}
	}

	//初始化状态
	bool ISimDataBase::GetState() 
	{		
		return m_bState;
	}

	//错误消息
	string ISimDataBase::GetErrorMessage() 
	{
		return m_strErrorMessage;
	}
	
	//设置连接参数
	void ISimDataBase::SetConnectPram(const DBTYPE& DbType,const string& strIP,const string& strDBname, const string& strUser, const string& strPwd)
	{
		m_DbType = DbType;
		m_strIP = strIP;
		m_strDBname = strDBname;
		m_strUser = strUser;
		m_strPwd = strPwd;

		m_pSimDataBase = CDbFactory::MakeDbServer(m_DbType,m_strIP,m_strDBname,m_strUser,m_strPwd);
	}

	//获取实例
	ISimDataBase* ISimDataBase::GetInstance()
	{
		if (NULL == m_pSimDataBase)
		{
			m_pSimDataBase = CDbFactory::MakeDbServer(m_DbType,m_strIP,m_strDBname,m_strUser,m_strPwd);
		}

		return m_pSimDataBase;
	}
}

CMySqlServer.h文件:

#ifndef _MYSQL_SERVER_H
#define _MYSQL_SERVER_H

#include "isimdatabase.h"
//#include "winsock.h"
#include "mysql.h"

using namespace std;
namespace SimDataBase
{
	namespace MySql
	{
		class  CMySqlServer :public SimDataBase::ISimDataBase
		{
		public:
			CMySqlServer(string strIP, string strDBname, string strUser, string strPwd);
			virtual ~CMySqlServer(void);
		public:
			//连接DB
			virtual bool Connect(string strIP, string strDBname, string strUser, string strPwd);
			//获取数据存入容器中
			virtual long GetDatas(vector<vector<char*> > &datas, const char* sql);
			//转换数据类型
			//virtual bool GetDataByType(string &valStr, const _variant_t &value){}
			//执行sql语句
			virtual long ExecuteSQL(const char* sql);
			//事务操作(多个sql语句)
			virtual long ExecuteSQLs(const vector<char*> &sqls);
			初始化状态
			//virtual bool GetState() const;
			错误消息
			//virtual string GetErrorMessage() const;
			//连接状态
			virtual int GetConnectionState();
		private:
			MYSQL *m_pConnection;
			//MYSQL_RES *m_pResult;
		};
	}
}

#endif

MySqlServer.cpp文件:

#include "StdAfx.h"
#include "MySqlServer.h"

namespace SimDataBase
{
	namespace MySql
	{
		CMySqlServer::CMySqlServer(string strIP, string strDBname, string strUser, string strPwd)
		{
			m_bState = false;
			m_pConnection = NULL;
			//m_pResult = NULL;

			m_pConnection = mysql_init((MYSQL*) 0);
			if (m_pConnection)
			{
				if(Connect(strIP,strDBname,strUser,strPwd))
				{
					m_bState = true;
				}
				else
				{
					m_bState = false;
					m_unErrorCode = 10001;
					m_strErrorMessage = "创建连接失败!";
				}
			}
			else
			{
				m_bState = false;
				m_unErrorCode = 10000;
				m_strErrorMessage = "连接对象初始化失败!";
			}
		}

		CMySqlServer::~CMySqlServer(void)
		{
			if (m_pConnection)
			{
				mysql_close(m_pConnection);
				m_pConnection = NULL;
			}
		}

		//连接DB
		bool CMySqlServer::Connect(string strIP, string strDBname, string strUser, string strPwd)
		{
			m_pConnection = mysql_real_connect(m_pConnection,strIP.c_str(),strUser.c_str(),strPwd.c_str(),\
				strDBname.c_str(),3306/*TCP IP端口*/,NULL/*Unix Socket 连接类型*/,0/*运行成ODBC数据库标志*/);
			if (m_pConnection)
			{
				//mysql_query(m_pConnection,"set names 'GBK'"); //使用GBK中文编码
				m_pConnection ->reconnect = 1;
				char *ch = "set names 'GBK'";
				int n=mysql_real_query(m_pConnection,ch,strlen(ch));
				if (n)
				{
					m_unErrorCode = 10002;
					m_strErrorMessage = mysql_error(m_pConnection);

					return false;
				} 

				return true;
			}
			else
			{
				return false;
			}
		}

		//获取数据存入容器中
		long CMySqlServer::GetDatas(vector<vector<char*> > &datas, const char* sql)
		{
			long nFlag = -1;
			MYSQL_ROW row;
			int t;

			int nRes = mysql_real_query(m_pConnection,sql,strlen(sql));
			if (nRes)
			{ 
				m_unErrorCode = 10003;
				m_strErrorMessage = mysql_error(m_pConnection);

				return nFlag;
			} 

			MYSQL_RES *pResult = mysql_store_result(m_pConnection);//将结果保存在res结构体中			
			while(row = mysql_fetch_row(m_pResult))
			{ 
				/** * MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result); 
				* 检索行*/
				vector<char*> vecData;
				for(t=0;t<(int)mysql_num_fields(pResult);t++)
				{   
					vecData.push_back(row[t]);
				}  

				datas.push_back(vecData);
			}   
			mysql_free_result(pResult); 			
			//nFlag = mysql_affected_rows(m_pConnection);
			nFlag = datas.size();
			return nFlag;
		}

		//转换数据类型
		//virtual bool GetDataByType(string &valStr, const _variant_t &value) = 0;

		//执行sql语句
	    long CMySqlServer::ExecuteSQL(const char* sql)
		{
			long nFlag = -1;

			int nRes = mysql_real_query(m_pConnection,sql,strlen(sql));
			if (nRes)//返回0成功,返回1表示失败
			{
				m_unErrorCode = 10004;
				m_strErrorMessage = mysql_error(m_pConnection);

				return nFlag;			
			}

			nFlag = nRes ;
			return nFlag;
		}

		//事务操作(多个sql语句)
		long CMySqlServer::ExecuteSQLs(const vector<char*> &sqls)
		{
			long nFlag = -1;
			int res = 1;

			mysql_query(m_pConnection,"BEGIN"); //或者mysql_query("START TRANSACTION");
			for (int i=0;i<(int)sqls.size();++i)
			{
				res = mysql_query(m_pConnection,sqls[i]);
				if (res)
				{
					m_unErrorCode = 10005;
					string strSql = sqls[i];
					m_strErrorMessage = "sql语句("+strSql+")执行出错:"+ mysql_error(m_pConnection);
					break;
				}
			}

			if(!res)
			{
				nFlag = res ;
				mysql_query(m_pConnection,"COMMIT");			
			}
			else
			{
				mysql_query(m_pConnection,"ROLLBACK");
			}
			mysql_query(m_pConnection,"END"); 

			return nFlag;
		}
		
		//连接状态
		int CMySqlServer::GetConnectionState()
		{
			return (int)m_pConnection->server_status;
		}
	}
}

EnumDef.h文件:

#ifndef _ENUM_DEF_H_
#define _ENUM_DEF_H_

#ifndef DB_API_EX_IM
#define DB_API_EX_IM_PORT __declspec(dllexport)
#else
#define DB_API_EX_IM_PORT __declspec(dllimport)
#endif

enum DB_API_EX_IM_PORT  DBTYPE
{
	DB_MYSQL         = 1,//MySql数据库
	DB_ORACLE        = 2,//Oracle数据库
	DB_SQLSERVER     = 3 //SqlServer数据库
};

#endif

DbFactory.h文件:

#ifndef _DBFACTORY_H_
#define _DBFACTORY_H_

#ifndef DB_API_EX_IM
#define DB_API_EX_IM_PORT __declspec(dllexport)
#else
#define DB_API_EX_IM_PORT __declspec(dllimport)
#endif
#include <vector>
#include <string>
#include "isimdatabase.h"
#include "EnumDef.h"
using namespace std;

namespace SimDataBase
{
	class DB_API_EX_IM_PORT CDbFactory
	{
	public:
		CDbFactory(void);
	public:
		static ISimDataBase* MakeDbServer(const DBTYPE& DbType,const string& strIP,const string& strDBname, const string& strUser, const string& strPwd);
	};
}

#endif

DbFactory.cpp文件:

#include "Stdafx.h"
#include "DbFactory.h"
#include "MySqlServer.h"

namespace SimDataBase
{
	CDbFactory::CDbFactory(void)
	{
	}

	ISimDataBase* CDbFactory::MakeDbServer(const DBTYPE& DbType,const string& strIP,const string& strDBname, const string& strUser, const string& strPwd)
	{
		if (DB_MYSQL == DbType)
		{
			return new SimDataBase::MySql::CMySqlServer(strIP,strDBname,strUser,strPwd);
		}
		else if (DB_ORACLE == DbType)
		{
			return NULL;
		}
		else if (DB_SQLSERVER == DbType)
		{
			return NULL;
		}
		else
		{
			return NULL;
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值