首先下载并安装mysql,我使用的为mysql 5.5版本,安装时注意安装c++的开发包。
#1 下载mysql++,解压, 找到install.hta, 修改对应路径,指向vc2008所在路径, 生成mysql++ 的lib 至某路径, 如 d:\mysql++3.10\ include
#2 打开mysql++ vc2008目录是mysql++_mysqlpp.sln, 升级到vs2010版本, 因为vs2010去掉了针对整个解决方案修改vc目录的功能(只能单个项目修改,所以原项目编译不过)
#3 视图》其它窗口》随意选择一个项目 ,打开 win32….user节点, 设置vc目录(include, lib 等),则将应用于整个解决方案, 其它项目将继承此设置.
A 需要将 mysql安装目录的lib 路径 设置到 vc目录的lib
B 需要将 mysql安装目录的inlucde路径设置到vc目录的 包含目录及引用目录
C 原解决方案已含了 vc2008上级目录的lib文件夹,因此不用再行设置。
D 复制libmysql.lib 到某目录下,此目录加入到vc目录的lib
#4 编译vc2008解决方案, 将编译成功的 mysqlpp_d.dll, mysqlpp_d.lib, mysql_excommon.lib 保留。
至此,我们已准备好了 mysql++所需要的头和库文件 d:\mysql++3.10\ include 及 第#4步生成的几个库文件。
接下来我们将其应用于新的项目中
#1 新建 vc2010项目, 因为只有单个项目,直接在项目属性页里设置vc路径
A 包含目录 ,设置为用install.hta生成的路径, 即上述的 d:\mysql++3.10\include. 当然还包括mysql安装目录下的MySQL Server 5.5\include
B 引用目录, 同上
C 库目录, 同上, 并且增加了 mysql安装目录下的 MySQL Server 5.5\lib 目录。 并且 我将第 #4 步编译成功的 几个库文件复制在了 d:\mysql++3.10\ include目录下
#2 在项目中增加现有项,加入mysqlpp_d.lib, mysqlpp_excommon.lib, libmysql.lib
#3 将mysqlpp_d.dll 复制到 c:\windows\system32目录下
#4 设置项目的link的依赖项, 增加对此三lib文件的依赖 . 项目属性页>链接器>输入>额外依赖项>libmysql.lib;mysqlpp_d.lib;mysqlpp_excommon.lib;后面是项目默认的win32库如kernel32.lib之类。
#5 试写简单的测试代码,从 test库的ta表中输出记录.
// tstMYSQL.cpp : 定义控制台应用程序的入口点。 // #include"stdafx.h" #include<string> #include<iostream> #include<mysql++.h> using namespacemysqlpp; using namespace std; int _tmain(int argc,_TCHAR* argv[]) { mysqlpp::Connection con(false); con.connect("test","localhost","root","密码",3306); cout<<"connect to server ok"; cout<<'\t'<<endl; mysqlpp::Query query = con.query("select name from ta"); if (mysqlpp::StoreQueryResult res = query.store()) { cout << "the it members as bellow :" << endl; for (size_t i = 0; i < res.num_rows(); ++i) { cout << '\t' << res[i][0] << endl; } } cout<<'\t'<< "show complete, press any key toexit."<<endl; cin.get(); con.disconnect(); return 0; }
至此已完成mysql++访问mysql的测试。
接下来,试用连接池. mysql++提拱了connectionpool的接口, 我们需要对这个虚类的实现。
以下生成CConnectionPool的派生类来进行实现 (参考mysql++示例文档)
class CConnectionPool : public mysqlpp::ConnectionPool { public: CConnectionPool( const char* db, const char* server, const char* user, const char* password) : db_(db ? db : ""), server_(server ? server : ""), user_(user ? user : ""), password_(password ? password : "") { } ~CConnectionPool() { clear(); } mysqlpp::Connection* grab() { ++conns_in_use_; return mysqlpp::ConnectionPool::grab(); } void release(const mysqlpp::Connection* pc) { mysqlpp::ConnectionPool::release(pc); --conns_in_use_; } protected: mysqlpp::Connection* create() { return new mysqlpp::Connection( db_.empty() ? 0 : db_.c_str(), server_.empty() ? 0 : server_.c_str(), user_.empty() ? 0 : user_.c_str(), password_.empty() ? "" : password_.c_str()); } void destroy(mysqlpp::Connection* cp) { delete cp; } unsigned int max_idle_time() { return NULL; } private: //Number of connections currently in use unsigned int conns_in_use_; //connection parameters std::string db_, server_, user_, password_; }; CConnectionPool* poolptr = 0;
调用示例:
//定义数据库连接信息 const char* db ="test", *server = "localhost", *user ="root", *pass = "xxxx"; //准备连接池 poolptr = new CConnectionPool(db, server, user, pass); //从连接池返回一个可用连接 mysqlpp::ScopedConnection cp(*poolptr, true); cout<<"MySQL++ Connection Pool Test"; cout<<char(13)<<"IT members asbellow:"<<char(13)<<endl; //利用此连接进行操作 mysqlpp::Query query = cp->query("select name from ta"); if(mysqlpp::StoreQueryResult res = query.store()) { cout << "the it members as bellow :" << endl; for (size_t i = 0; i < res.num_rows(); ++i) { cout <<char(13) << '\t'<< res[i][0] << endl; } } cout<<char(13)<< "show completes, press any key toexit."<<endl; cin.get(); cp->disconnect();
另外,mysql++里准备了threads.h 用于多线程处理, 可以自行调整 。
关于mysql++的更多操作,请参见mysql++手册。