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