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

}