Chinaunix首页 | 论坛 | 博客
  • 博客访问: 637201
  • 博文数量: 116
  • 博客积分: 6078
  • 博客等级: 准将
  • 技术积分: 1214
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-23 10:09
文章分类

全部博文(116)

文章存档

2016年(1)

2015年(4)

2011年(2)

2010年(21)

2009年(88)

分类: C/C++

2009-07-01 14:01:36

    mysql的数据库在使用的时候发现真的很好用,但是访问的时候,用它所提供的原始的C库,太累了些,于是有很多基于C++封装的库出现,那么MYSQL++是一个可以在多平台上与MYSQL的C库配合使用的库,也是官方推荐的一套库,如果在项目中使用到wxWidgets这个跨平台的UI库,也可以使用databaselayer这个基于一些wx的类型的库。
    在使用时总体感觉mysql++效率要高不少。闲话少叙,开始干活。
    1. 先到 下载mysql++源码.
    2. 将mysql++的VS2008的PRO打开后编译成msyqlpp.lib,mysqlpp_excommon.lib,mysqlpp.dll等几个动态或静态库。需要注意的是mysql的头文件及相关库文件需指定地方或加到VS工具的option->vc directories中.
    那面就可以开始写自己的应用部分的程序,在这里只列出一个线程对数据库进行访问操作,多线程同步不做处理。
    我个人做了一个叫dbcenter用于应用与mysql++进行访问的唯一接口。头文件如下
//
//=============================================================
/*
Copyright (c) 2009 Richtech Co.,Ltd. All rights reserved
Module Name:数据库操作与msyqlpp库间的接口
Abstract:   为具体的数据库访问提供唯一接口支持
Revision History:
            初始版本:1.0.0  by 李浩
              mailto:lihaoyxj@gmail.com

*/
//==============================================================
//
    #ifndef __DBCENTER_H
#define __DBCENTER_H
#include "Lock.h"
#define BUFFSIZE 100

class CDBCenter
{
    private:
        CDBCenter();
        ~CDBCenter();
        static CDBCenter * m_Instance;
    public:
        static CDBCenter* getInstance();
        void releaseInstance();

        bool RunQuery(CString sql);
        bool RunQueryWithResult(CString sql,mysqlpp::StoreQueryResult& res);
        bool InitDBCenter();
        //mysqlpp::Connection* getConn(){return &m_conn;}
    private:
        CLock lock;
        mysqlpp::Connection m_conn;
       
        bool b_connected;
        void CloseDB();
};
#endif
在这里dbcenter作为singleton模式存在于整个项目中,只依赖于一个connection与数据库打交道,从而在对数据库操作方面有便捷性和,易配置、易管理。
在这里没有把初始化的工作放在构造函数中,因为初始化数据库及连接需要给应用程序返回一个状态。所以应是在
   CDBCenter* db=CDBCenter::getInstance();后调用InitDBCenter();按返回值来确定是不是连接成功了。
   在这里把RunQuery()这个分为二部分,bool RunQuery(CString sql);为只执行更新语句,
           bool RunQueryWithResult(CString sql,mysqlpp::StoreQueryResult& res);为执行带返回值的,由于我们要的结果集为result,所以通过引用传进来就可以了,而之前我曾使用Query这个执行过程体作为传递值的对象,但由于在Query中存在监时变量,在传递后,返回值就没有了。故只要使用StoreQueryResult这个对象就可以了。
      下面把相关的接口实现也暴露一下:
bool CDBCenter::RunQuery(CString sql)
{
    //WideCharToMultiByte(CP_OEMCP, 0, strPassword, -1, szPswd, strPassword.GetLength(), NULL, NULL);
    sql +=" ";
    DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,sql,-1,NULL,0,NULL,FALSE);
    char * szSql;
    szSql = new char[dwNum];
    if (!szSql)
    {
        delete [] szSql;
    }
    memset(szSql,0,dwNum);
    WideCharToMultiByte(CP_OEMCP, 0, sql, -1, szSql, dwNum, NULL, NULL);
    lock.lock();
    mysqlpp::Query q=m_conn.query();
    q << szSql;
    q.execute();
    lock.unlock();
    if (szSql)
    {
        delete [] szSql;
        szSql = NULL;
    }
    return true;

}
bool CDBCenter::RunQueryWithResult(CString sql,mysqlpp::StoreQueryResult& res)
{
    sql += " ";
    DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,sql,-1,NULL,0,NULL,FALSE);
    char * szSql;
    bool bResult=false;
    szSql = new char[dwNum];
    if (!szSql)
    {
        delete [] szSql;
    }
    memset(szSql,0,dwNum);
    WideCharToMultiByte(CP_OEMCP, 0, sql, -1, szSql, dwNum, NULL, NULL);
    lock.lock();
    mysqlpp::Query q=m_conn.query(szSql);
    //q=m_conn.query(szSql);
    if (res = q.store()) {
        bResult=true;
    }
    lock.unlock();
    if (szSql)
    {
        delete [] szSql;
        szSql = NULL;
    }
    return bResult;
}


//这个函数里很多是无用的代码,是在开始调试时加的
bool CDBCenter::InitDBCenter()
{
    if (!m_conn.connected())
        {
        CDBConfig config;
        config.ReadConfig();
        CString strServer=config.getServer();
        CString strDbName=config.getDBName();
        //int nPort=config.getPort();
        CString strUsername = config.getUsername();
        CString strPassword = config.getPasswrod();
        char szServer[BUFFSIZE];
        char szDbname[BUFFSIZE];
        char szUser[BUFFSIZE];
        char szPswd[BUFFSIZE];
        memset(szDbname,0,BUFFSIZE);
        memset(szPswd,0,BUFFSIZE);
        memset(szServer,0,BUFFSIZE);
        memset(szUser,0,BUFFSIZE);

        //szDbname=strDbName.GetBuffer(strDbName.GetLength());
        WideCharToMultiByte(CP_OEMCP, 0, strDbName, -1, szDbname, strDbName.GetLength(), NULL, NULL);
        //strcpy(szPswd,(LPTSTR)(LPCTSTR)strPassword);
        //strcpy(szServer,(LPTSTR)(LPCTSTR)strServer);
        //strcpy(szUser,(LPTSTR)(LPCTSTR)strUsername);
        WideCharToMultiByte(CP_OEMCP, 0, strPassword, -1, szPswd, strPassword.GetLength(), NULL, NULL);
        WideCharToMultiByte(CP_OEMCP, 0, strServer, -1, szServer, strServer.GetLength(), NULL, NULL);
        WideCharToMultiByte(CP_OEMCP, 0, strUsername, -1, szUser, strUsername.GetLength(), NULL, NULL);

        b_connected=m_conn.connect(szDbname,szServer,szUser,szPswd);
        }
    return b_connected;
}
void CDBCenter::CloseDB()
{
    if (m_conn.connected())
        {
        m_conn.disconnect();
        b_connected =false;
        }

}
现在可以使用这个接口了,呵
   
阅读(2931) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-08-06 17:47:10

你的女儿很可爱,呵呵……