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; } } 现在可以使用这个接口了,呵