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

C++访问MySQL数据

2015-07-30 13:08 501 查看
自己封装了一个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_b
e6fd
State = false;
m_unErrorCode = 10000;
m_strErrorMessage = "连接对象初始化失败!";
}
}

CMySqlServer::~CMySqlServer(void)
{
if (m_pResult)
{
mysql_free_result(m_pResult);
m_pResult = NULL;
}

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

m_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(m_pResult);t++)
{
vecData.push_back(row[t]);
}

datas.push_back(vecData);
}
//mysql_free_result(m_pResult);
nFlag = mysql_affected_rows(m_pConnection);

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 = mysql_affected_rows(m_pConnection);
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 = mysql_affected_rows(m_pConnection);
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;
}
}

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