MYSQL API C++ 版封装

  • 格式:doc
  • 大小:297.00 KB
  • 文档页数:14

利用MYSQL ++进行数据库开发1.目的:为了熟悉JDBC的程序员快速上手,减少开发难度,加快开发进度。

2.待解决内容:a>封装Connection类,包括连接,和一些属性的设置。

b>封装Query类,提供方法:无数据返回的提交exec(),有数据返回的提交execute ()主要针对select。

c>Select Query 结果集Result的使用问题!3.解决方案:由于目前开发进度要求很紧的实际情况,不能从底层MySql CAPI开始封装,因此,在MySql++(一个比较成熟的Mysql C API的C++封装版)基础上,进行了部分优化和调整,给出一个比较全面的使用实例,其中给出了常用的方面,如果没有涉及的,可参看Mysql++的使用手册。

4.使用指南:4.1:环境搭建:主要说明环境的搭建和程序部署时的一些注意事项用到的文件,mysqlppDev.rar是mysql++文件夹的压缩包,第一步:将压缩文件解压到工程文件所在的文件夹:mysql++文件夹中包含:头文件:include,库文件:lib,mysql的动态库:libmySQL.dllmysql的头文件:mysql/include并将…/census/mysql++/libmySQL.dll剪切(CTRL+X)到…/census目录下:第二步:打开工程文件,新建一个目录,Library Files将mysql++.lib添加到工程中去。

选中mysql++.lib,添加到Library Files文件夹中。

第三步:对工程选项进行设置选择Project->Settings->C/C++页a> 在studio中project-setting-C/C++-catogery中选择Preprocesser,在additional include directories添加.\mysql++\include,.\mysql++\mysql\include,,确定,在自己的编写的文件中就可以使用#include <mysql++>了b>在studio中project-setting-C/C++-catogery中选择Code Generation,将Use run-time library:下面选项设为:Multithreaded DLL,第四步,现在,就可以使用mysql++进行编程了。

再注意一点:生成的程序,在打包时,应该把libmySQL.dll打包在同一级目录下。

4.2 Mysql++类使用说明4.2.1包含头文件在需要使用mysql数据库操作的时候,包含封装了mysql++的# include “conmgr.h”,位于…/src/include 文件夹下。

具体内容如下://conmgr.h#ifndef _BASE_CENSUS#include <baseclass.h>#endif#include <mysql++>//定义结构//连接信息struct ConInfo{string mDB;string mHost;string mUser;string mPass;//连接缓冲池struct ConnectionPool{bool used;ConInfo dbinfo;Connection con;};//定义DAOFactoryclass DBConnector :public Object{private:DBConnector():mMaxSize(5),mCurSize(0){}//定义dbConnector的实例static DBConnector* _dbc;//int mMaxSize;int mCurSize;static struct ConnectionPool conns[10];//根据用户登陆的信息查找连接信息int findConnection(ConInfo info);//根据连接查找int findConnection(Connection* con);void init(ConInfo info);public://单例模式static DBConnector* DBConnector::getConnector(){if (_dbc==NULL)_dbc=new DBConnector();return _dbc;};//得到连接Connection* getConnection(string aDB,string aHost,string aUser,string aPass);//释放连接void DBConnector::delConnection(Connection* con);};DBConnector* DBConnector::_dbc;struct ConnectionPool DBConnector::conns[10];//根据用户登陆的信息查找连接信息int DBConnector::findConnection(ConInfo info)for (int i=0;i<mCurSize;i++){if ((info.mDB == conns[i].dbinfo.mDB)&&(info.mHost == conns[i].dbinfo.mHost)&&(info.mPass == conns[i].dbinfo.mPass)&&(info.mUser == conns[i].dbinfo.mUser)&&(conns[i].used == false))return i;};return -1;}//根据连接查找int DBConnector::findConnection(Connection* con){for (int i=0;i<mCurSize;i++){if (&(conns[i].con) == con)return i;};if (mCurSize < mMaxSize){return -1;}else{return -2;};}void DBConnector::init(ConInfo info){Connection * con=new Connection(use_exceptions);try{con->connect(info.mDB.c_str(),info.mHost.c_str(),info.mUser.c_str(),info.mPass.c_str());if (mCurSize < mMaxSize){conns[mCurSize].used = false;conns[mCurSize].dbinfo=info;conns[mCurSize].con = *con;mCurSize ++;};}catch (BadQuery er){};}//得到连接Connection* DBConnector::getConnection(string aDB,string aHost,string aUser,string aPass) {struct ConInfo info;info.mDB = aDB;info.mHost = aHost;info.mUser = aUser;info.mPass = aPass;//查找缓存中的这个连接int iConn = findConnection(info);//如果没有找到并且缓存还没有满if (iConn == -1){init(info);iConn = mCurSize - 1;};/*if (iConn<0)throw ;*/conns[iConn].used = true;return &(conns[iConn].con);// return Connection(aDB.c_str(),aHost.c_str(),aUser.c_str(),aPass.c_str());}//释放连接void DBConnector::delConnection(Connection* con){int iConn = findConnection(con);if (iConn >=0){conns[iConn].used = false;};}4.2.2使用说明主要内容包括:如何对异常进行处理,如何连接数据库,如何执行不需要返回结果集的SQL操作,如何进行有返回结果集的查询并对结果集进行处理。

a>如何连接数据库使用DBConnector类的活得一个连向数据库的句柄,DBConnector在conmgr.h中实现。

DBConnecotr类中定义了如何获得一个数据库连接。

得到连接Connection* getConnection(string aDB,string aHost,string aUser,string aPass);其中各参数含义如下:aDB:数据库名,aHost:数据库主机值可以是一个主机IP地址。

aUser:数据库连接用户名,aPass:数据库连接用户密码,具体使用中如何得到一try {//得到一个DBConnector对象,其中class DBConnector使用的是单例模式DBConnector *dbc = DBConnector::getConnector();//使用DBConnector的getConnection方法获得一个数据库连接指针,Connection *con = dbc->getConnection("proj1","10.1.1.2","root","");//接下来就可以使用获得连接指针con,进行相应的数据库操作了。

} catch (BadQuery er){……….b>如何进行异常处理:使用mysql++的过程中,有两类异常:数据库操作异常类:struct BadQuery {BadQuery(string er) : error(er) {}string error; //: 错误信息,传递出由MYSQL数据库给出的错误信息。

};数据转换异常结构:struct BadConversion {const char* type_name; //:待转换成的类型名const string data; //:待转换的数据size_t retrieved; //:得到的长度size_t actual_size;//:实际长度BadConversion(const char* tn, const char* d, size_t r, size_t a) : type_name(tn), data(d), retrieved(r), actual_size(a) {};};获得之后,抛出系统自定义的异常MyProjectException,实例如下:try{…….……..}catch (BadQuery er){throw MyProjectException("InputOrgListDAO",er.error);}catch (BadConversion er) {ostrstream errbuf;errbuf<< "Error: Tried to convert \"" << er.data << "\" to a \""<< er.type_name << "\"." <<ends;throw MyProjectException("InputOrgListDAO",errbuf.str());}异常的捕捉应该放在BPI中:Vector v;try{v=bpo->queryOrgnListByType();}catch(MyProjectException e){}c>如何执行不需要返回结果集的SQL操作主要工作是拼装一个符合SQL语言语法的字符串man_str,交给Query对象执行,query.exec((const string&)man_str);得到一个Query对象…..//con 是一个数据库连接指针。