织梦CMS - 轻松建站从此开始!

罗索

在VC开发项目中使用 MYSQL++

jackyhwei 发布于 2010-11-26 15:31 点击:次 
mysql的数据库在使用的时候发现真的很好用,但是访问的时候,用它所提供的原始的C库,太累了些,于是有很多基于C++封装的库出现,那么MYSQL++是一个可以在多平台上与MYSQL的C库配合使用的库
TAG:

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
*/

  1. #ifndef __DBCENTER_H 
  2. #define __DBCENTER_H 
  3. #include "Lock.h" 
  4. #define BUFFSIZE 100 
  5.  
  6. class CDBCenter 
  7. private
  8. CDBCenter(); 
  9. ~CDBCenter(); 
  10. static CDBCenter * m_Instance; 
  11. public
  12. static CDBCenter* getInstance(); 
  13. void releaseInstance(); 
  14.  
  15. bool RunQuery(CString sql); 
  16. bool RunQueryWithResult(CString sql,mysqlpp::StoreQueryResult& res); 
  17. bool InitDBCenter(); 
  18. //mysqlpp::Connection* getConn(){return &m_conn;} 
  19. private
  20. CLock lock; 
  21. mysqlpp::Connection m_conn; 
  22.  
  23. bool b_connected; 
  24. void CloseDB(); 
  25. }; 
  26. #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这个对象就可以了。

下面把相关的接口实现也暴露一下:

  1. bool CDBCenter::RunQuery(CString sql) 
  2. //WideCharToMultiByte(CP_OEMCP, 0, strPassword, -1, szPswd
  3. //, strPassword.GetLength(), NULL, NULL); 
  4. sql +=" "
  5. DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,sql,-1,NULL,0,NULL,FALSE); 
  6. char * szSql; 
  7. szSql = new char[dwNum]; 
  8. if (!szSql) 
  9. delete [] szSql; 
  10. memset(szSql,0,dwNum); 
  11. WideCharToMultiByte(CP_OEMCP, 0, sql, -1, szSql, dwNum, NULL, NULL); 
  12. lock.lock(); 
  13. mysqlpp::Query q=m_conn.query(); 
  14. q << szSql; 
  15. q.execute(); 
  16. lock.unlock(); 
  17. if (szSql) 
  18. delete [] szSql; 
  19. szSql = NULL; 
  20. return true
  21.  
  22. bool CDBCenter::RunQueryWithResult(CString sql,mysqlpp::StoreQueryResult& res) 
  23. sql += " "
  24. DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,sql,-1,NULL,0,NULL,FALSE); 
  25. char * szSql; 
  26. bool bResult=false
  27. szSql = new char[dwNum]; 
  28. if (!szSql) 
  29. delete [] szSql; 
  30. memset(szSql,0,dwNum); 
  31. WideCharToMultiByte(CP_OEMCP, 0, sql, -1, szSql, dwNum, NULL, NULL); 
  32. lock.lock(); 
  33. mysqlpp::Query q=m_conn.query(szSql); 
  34. //q=m_conn.query(szSql); 
  35. if (res = q.store()) { 
  36. bResult=true
  37. lock.unlock(); 
  38. if (szSql) 
  39. delete [] szSql; 
  40. szSql = NULL; 
  41. return bResult; 
  42.  
  43. //这个函数里很多是无用的代码,是在开始调试时加的 
  44. bool CDBCenter::InitDBCenter() 
  45. if (!m_conn.connected()) 
  46. CDBConfig config; 
  47. config.ReadConfig(); 
  48. CString strServer=config.getServer(); 
  49. CString strDbName=config.getDBName(); 
  50. //int nPort=config.getPort(); 
  51. CString strUsername = config.getUsername(); 
  52. CString strPassword = config.getPasswrod(); 
  53. char szServer[BUFFSIZE]; 
  54. char szDbname[BUFFSIZE]; 
  55. char szUser[BUFFSIZE]; 
  56. char szPswd[BUFFSIZE]; 
  57. memset(szDbname,0,BUFFSIZE); 
  58. memset(szPswd,0,BUFFSIZE); 
  59. memset(szServer,0,BUFFSIZE); 
  60. memset(szUser,0,BUFFSIZE); 
  61.  
  62. //szDbname=strDbName.GetBuffer(strDbName.GetLength()); 
  63. WideCharToMultiByte(CP_OEMCP, 0, strDbName, -1, szDbname
  64. , strDbName.GetLength(), NULL, NULL); 
  65. //strcpy(szPswd,(LPTSTR)(LPCTSTR)strPassword); 
  66. //strcpy(szServer,(LPTSTR)(LPCTSTR)strServer); 
  67. //strcpy(szUser,(LPTSTR)(LPCTSTR)strUsername); 
  68. WideCharToMultiByte(CP_OEMCP, 0, strPassword, -1, szPswd
  69. , strPassword.GetLength(), NULL, NULL); 
  70. WideCharToMultiByte(CP_OEMCP, 0, strServer, -1, szServer
  71. , strServer.GetLength(), NULL, NULL); 
  72. WideCharToMultiByte(CP_OEMCP, 0, strUsername, -1, szUser
  73. , strUsername.GetLength(), NULL, NULL); 
  74.  
  75. b_connected=m_conn.connect(szDbname,szServer,szUser,szPswd); 
  76. return b_connected; 
  77. void CDBCenter::CloseDB() 
  78. if (m_conn.connected()) 
  79. m_conn.disconnect(); 
  80. b_connected =false

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

(李浩)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201011/10545.html]
本文出处:lihaoyxj.cublog.cn 作者:李浩
顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容