mysql源码学习 vc项目解决方案文件_在VC开发项目中使用 MYSQL++

mysql的数据库在使用的时候发现真的很好用,但是访问的时候,用它所提供的原始的C库,太累了些,于是有很多基于C++封装的库出现,那么MYSQL++是一个可以在多平台上与MYSQL的C库配合使用的库,也是官方推荐的一套库,如果在项目中使用到wxWidgets这个跨平台的UI库,也可以使用databaselayer这个基于一些wx的类型的库。

在使用时总体感觉mysql++效率要高不少。闲话少叙,开始干活。

1. 先到http://tangentsoft.net/mysql++/ 下载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;

}

}

现在可以使用这个接口了,呵

阅读(2524) | 评论(1) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值