首先下载并安装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++手册。