最近的项目数据库管理系统从sql server2000迁移到了mysql上来,之前基于ado的连接方式连接上sql server,使用mysql数据库管理系统之后,直接在mysql的c语言的api上以面向对象的方式封装实现了数据库的创建,表的创建,数据库的读写操作快速搭建原型,目前没
最近的项目数据库管理系统从sql server2000迁移到了mysql上来,之前基于ado的连接方式连接上sql server,使用mysql数据库管理系统之后,直接在mysql的c语言的api上以面向对象的方式封装实现了数据库的创建,表的创建,数据库的读写操作快速搭建原型,目前没有添加连接池模块和事务处理。
源码托管在github上:https://github.com/figot/mysqlwrapper
1.mysql的特性使用c和c++编写,并使用了多种编译器进行测试,保证源代码的可移植性。
支持aix、bsdi、freebsd、hp-ux、linux、mac os、novell netware、netbsd、openbsd、os/2 wrap、solaris、windows等多种操作系统。
为多种編程语言提供了api。这些編程语言包括c、c++、c#、vb.net、delphi、eiffel、java、perl、php、python、ruby和tcl等。
支持多線程,充分利用cpu资源,支持多用户。
優化的sql查询算法,有效地提高查询速度。
既能够作为一个单独的应用程序在客户端服务器网络环境中运行,也能够作为一个程序库而嵌入到其他的软件中。
提供多语言支持,常见的编码如中文的gb 2312、big5,日文的shift jis等都可以用作數據表名和數據列名。
提供tcp/ip、odbc和jdbc等多种数据库连接途径。
提供用于管理、检查、优化数据库操作的管理工具。
可以处理拥有上千万条记录的大型数据库。
2.c++的api封装用c++连接sql有两种可直接使用的接口:mysql connector/c++和mysql+ +,mysql connector/c++是最新发布的mysql连接器,由sun microsystems开发。mysql connector为c++提供面向对象的编程接口(api)和连接mysql server的数据库驱动器与现存的driver不同,connector/c++是jdbc api在c++中的实现。换句话说,connector/c++ driver的接口主要是基于java语言的jdbc api。java数据库连接(jdbc)是java连接各种数据库的业界标准。connector/c++实现了jdbc 4.0的大部分规范。熟悉jdbc编程的c++程序开发者可以提高程序开发的效率。
mysql++是一个用c++封装了mysql的c api的类库。它是建立标准c ++标准库(stl)之上,使处理数据库处理stl容器一样容易。此外,mysql的++提供了让你避免最重复的工作,提供了原生c++接口。
3.mysql的c++封装实现在快速搭建原型的过程中,没有用到这两种连接方式,直接在mysql c api上封装实现。
#ifndef __mysql_interface_h__#define __mysql_interface_h__#include winsock.h#include #include #include mysql.h#include #include #pragma comment(lib, ws2_32.lib)#pragma comment(lib, libmysql.lib)using namespace std;class mysqlinterface{public: mysqlinterface(); virtual ~mysqlinterface(); bool connectmysql(char* server, char* username, char* password, char* database,int port); bool createdatabase(std::string& dbname); bool createdbtable(const std::string& query); void errorintomysql(); bool writedatatodb(string querystr); bool getdatafromdb(string querystr, std::vector >& data); void closemysql();public: int errornum; //错误代号 const char* errorinfo; //错误提示private: mysql mysqlinstance; //mysql对象,必备的一个数据结构 mysql_res *result; //用于存放结果 建议用char* 数组将此结果转存};#endif
#include stdafx.h#include mysqlinterface.h//构造函数 初始化各个变量和数据mysqlinterface::mysqlinterface(): errornum(0),errorinfo(ok){ mysql_library_init(0,null,null); mysql_init(&mysqlinstance); mysql_options(&mysqlinstance,mysql_set_charset_name,gbk);}mysqlinterface::~mysqlinterface(){}//连接mysqlbool mysqlinterface::connectmysql(char* server, char* username, char* password, char* database,int port){ if(mysql_real_connect(&mysqlinstance,server,username,password,database,port,0,0) != null) return true; else errorintomysql(); return false;}//判断数据库是否存在,不存在则创建数据库,并打开bool mysqlinterface::createdatabase(std::string& dbname){ std::string querystr = create database if not exists ; querystr += dbname; if (0 == mysql_query(&mysqlinstance,querystr.c_str())) { querystr = use ; querystr += dbname; if (0 == mysql_query(&mysqlinstance,querystr.c_str())) { return true; } } errorintomysql(); return false;}//判断数据库中是否存在相应表,不存在则创建表bool mysqlinterface::createdbtable(const std::string& query){ if (0 == mysql_query(&mysqlinstance,query.c_str())) { return true; } errorintomysql(); return false;}//写入数据bool mysqlinterface::writedatatodb(string querystr){ if(0==mysql_query(&mysqlinstance,querystr.c_str())) return true; else errorintomysql(); return false; }//读取数据bool mysqlinterface::getdatafromdb(string querystr, std::vector >& data){ if(0!=mysql_query(&mysqlinstance,querystr.c_str())) { errorintomysql(); return false; } result=mysql_store_result(&mysqlinstance); int row=mysql_num_rows(result); int field=mysql_num_fields(result); mysql_row line=null; line=mysql_fetch_row(result); int j=0; std::string temp; while(null!=line) { std::vector linedata; for(int i=0; i