c++访问mysql类

来源:互联网 发布:手机淘宝怎么上传照片 编辑:程序博客网 时间:2024/06/10 08:05
//MySqlConn.h


#pragma once
#include <WinSock.h>
#include <mysql.h>

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libmysql.lib")

enum
{
    CmdText = 0,
    CmdFunc,
    CmdStore,
};

class MySqlConn
{
public:
    MySqlConn(void);
    ~MySqlConn(void);
private:
    MYSQL    *m_MySql;
    char            *m_pConnStr;
    CRITICAL_SECTION    m_csConn;
    LARGE_INTEGER    m_CountsOfSecond;
    LARGE_INTEGER    m_PrevCounts;
    LARGE_INTEGER    m_CurrCounts;
public:
    bool    InitConnect(const char* phost,const char* pUser,const char* pPwd,const char* pDbname,double &ftime, UINT    uPort = 3306);
    void CloseMysqlConn(void);
    MYSQL_RES* GetResult(const char* pParam,double &ftime,UINT uType = CmdText);
    void Lock(void);
    void UnLock(void);
    void ReleaseRes(MYSQL_RES* result);
};



//MySqlConn.cpp
#include <stdio.h>
#include "MySqlConn.h"

MySqlConn::MySqlConn(void)
{
    m_MySql = NULL;
    m_pConnStr = NULL;
    InitializeCriticalSection(&m_csConn);
    QueryPerformanceFrequency(&m_CountsOfSecond);
}

MySqlConn::~MySqlConn(void)
{
    if(m_pConnStr)
    {
        delete[] m_pConnStr;
        m_pConnStr = NULL;
    }
    DeleteCriticalSection(&m_csConn);
    mysql_library_end();
}

/************************************************************************/
/*初始化mysql连接
bool    InitConnect(
            const char* phost,    [IN]数据库IP地址,本机: localhost
            const char* pUser,    [IN]数据库登录用户  root
            const char* pPwd,    [IN]数据库登录密码,若为空: NULL
            const char* pDbname,    [IN]数据库名称:        database
            double &ftime,            [OUT]连接数据库需要的时间:    s
            UINT uPort                [IN]数据库开放端口: 3306
)
*/
/************************************************************************/
bool    MySqlConn::InitConnect(const char* phost,const char* pUser,const char* pPwd,const char* pDbname,double &ftime,UINT uPort /* = 3306 */)
{
    QueryPerformanceCounter(&m_PrevCounts);
    m_MySql = mysql_init(0);
    if(!mysql_real_connect(m_MySql,phost,pUser,pPwd,pDbname,uPort,NULL,CLIENT_MULTI_STATEMENTS))
    {
        QueryPerformanceCounter(&m_CurrCounts);
        ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
        const char* pErr = mysql_error(m_MySql);
        printf(pErr);
        return false;
    }
    QueryPerformanceCounter(&m_CurrCounts);
    ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
    return true;
}
void MySqlConn::CloseMysqlConn(void)
{
    mysql_close(m_MySql);
}

/************************************************************************/
/*获取数据结果集
MYSQL_RES* MySqlConn::GetResult(   
            const char* pParam,        [IN]数据库sql语句: select * from table / call procedrue / select function
            double &ftime                  [OUT]访问数据库所用时间:    s
            UINT uType                     [IN]数据库访问类型CmdText,CmdFunc,CmdStore
            )
*/
/************************************************************************/
MYSQL_RES* MySqlConn::GetResult(const char* pParam,double &ftime,UINT uType)
{
    MYSQL_RES *pResult;
    QueryPerformanceCounter(&m_PrevCounts);
    Lock();
    if(uType = CmdStore)
    {
        if(mysql_query(m_MySql,pParam) != 0)
        {
            UnLock();
            QueryPerformanceCounter(&m_CurrCounts);
            ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
            const char* pErr = mysql_error(m_MySql);
            printf(pErr);
            return NULL;
        }
    }
    else
    {
        if((mysql_real_query(m_MySql,pParam,strlen(pParam))) != 0)
        {
            UnLock();
            QueryPerformanceCounter(&m_CurrCounts);
            ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
            const char* pErr = mysql_error(m_MySql);
            printf(pErr);
            return NULL;
        }
    }
   
    pResult = mysql_use_result(m_MySql);
    if(!pResult)
    {
        UnLock();
        QueryPerformanceCounter(&m_CurrCounts);
        ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
        const char* pErr = mysql_error(m_MySql);
        printf(pErr);
        return NULL;
    }
    UnLock();
    QueryPerformanceCounter(&m_CurrCounts);
    ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
    return pResult;
}

/************************************************************************/
/*释放数据结果集
void MySqlConn::ReleaseRes(
                    MYSQL_RES* result        [IN]需要释放的结果集
                    )
*/
/************************************************************************/
void MySqlConn::ReleaseRes(MYSQL_RES* result)
{
    if(result)
    {
        mysql_free_result(result);
    }
}

void MySqlConn::Lock(void)
{
    EnterCriticalSection(&m_csConn);
}

void MySqlConn::UnLock(void)
{
    LeaveCriticalSection(&m_csConn);
}