C++访问MySQL数据
2015-07-30 13:08
501 查看
自己封装了一个CMySqlServer 类继承至基类ISimDataBase用于访问MySQL数据库,可扩展Oracle、SqlServer。在此做个记录,多多指教。
基类ISimDataBase:
isimdatabase.h文件
ISimDataBase.cpp文件:
CMySqlServer.h文件:
MySqlServer.cpp文件:
EnumDef.h文件:
DbFactory.h文件:
DbFactory.cpp文件:
基类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中的integer 数据类型
- MySQL存储过程
- 使用C++实现JNI接口需要注意的事项
- Android之获取手机上的图片和视频缩略图thumbnails
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 关于指针的一些事情
- 数据库链接字符串查询网站
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法