MySQL++是一个针对MySQL C API的C++封装。它的目的是提供一个类似STL容易一样简单易用的接口,帮助你有效的避免在代码中使用复杂的SQL语句。

[MySQL++ v3.1.0 用户手册] Kevin Atkinson Sinisa Milivojevic Monty Widenius Warren Young Copyright ? 1998-2001, 2005-2010 Kevin Atkinson (original author)MySQL ABEducational Technology Resources June 03, 2010 译者:自由骑士笃志 时间:2011-8-5

目录 1.简介 3 1.1. MySQL++历史简要 3 1.2. 如果你有问题 3 1. 概述 3 2.1. 连接对象 4 2.2. 查询对象 4 2.3. 结果表 4 2.4 异常 5 1. 指导 5 3.1. 运行例子 5 3.2. 一个简单的例子 6 3.3. 一个相对复杂一些的例子 7 3.4. 异常 9 3.5. 引用和引号泄露 10 3.6. C++ vs. SQL数据类型 10 3.7. 处理SQL的NULL 11 3.8. MySQL++的特殊的String类型 12 3.9. 处理二进制数据 13 3.10. 使用事务 18 3.11. 使用哪种查询方式? 24 3.12.处理带条件的结果行 25 3.13. 在一个结果表中为每行执行代码 27 3.14. 连接选项 28 3.15. 处理连接超时 31 3.16.一个连接上的并发查询 31 3.17.获取字段源数据 32

1.简介 MySQL++是一个针对MySQL C API的C++封装。它的目的是提供一个类似STL容易一样简单易用的接口,帮助你有效的避免在代码中使用复杂的SQL语句。 MySQL的最新版本可以从MySQL++的官方网页查看。 如果你希望支持MySQL开发工作,可以访问它的邮件列表,邮件列表内有记录开发人员名单,同时告诉你如何进行捐助。

1.1. MySQL++历史简要

MySQL++是1998年Kevin Atkinson创建的。它起步是初于MySQL,但是早期版本的目的是希望设计为数据库无关的,所以早期它被称为SQL++,在早期也曾被称为”sqlplus”。Kevin Atkinson完成了1.0之前的版本。 到了1999年,开始Monty Widenius做了一些对MySQL++的补全工作,完成了1.1,1.2版本,但是后来他去了另外一个MySQL公司。之后Sinisa一直对库进行维护,直到2001年中旬发布了1.7.9版本。此时,他们发现进行数据库无关的开发几乎是不可行的。 也就是这个1.7.9版本之后,MySQL++很久时间没有进行更新,这样持续了三年。期间内Sinira一直对MySQL++邮件列表的用户进行技术解答,有时会发布部分补丁,但是再未正式更新过。 在这个期间内还有个很糟糕的事情,2001年的时候,主流的C++编译器还无法支持标准C++。导致MySQL++使用了许多不标准的构造去适应老的编译器。直到MySQL++开始大量使用模板之后,这更增加了使用者的麻烦,他们在项目中使用MySQL++时会出现各种奇怪的警告和错误。 直到2004年八月,WarrenYoung实在无法忍受了,他将之前的许多零碎补丁整合起来,发布了1.7.10版本,这个版本使用GCC3.3编译后再没有任何警告。从那以后,MySQL++才逐渐的减少它的bug,开始变的有活力了。

1.2. 如果你有问题

如果针对这个库有什么问题,需要邮件咨询别人,我们很希望你可以发送邮件到MySQL++邮件列表。这个邮件列表有存档,或许你可以在里面搜索到别人已经提出同样的问题。 你可能会在MySQL++列表中发现一个私人邮箱,建议不要发送邮件给个人,因为有些开发者已经不再负责MySQL++的开发。

2.概述 MySQL++能够处理复杂的数据库操作,而事实上,它使用起来又比其他的数据库API简单,它的大致用法如下: 1: 开启连接。 2: 组成执行查询。 3: 如果成功则返回结果。 4: 如果失败则处理错误。 每一步均对应MySQL++的一个类。

2.1. 连接对象

每一个连接对象负责管理一个MySQL服务器的连接。你起码需要一个连接对象进行数据库事务处理。 MySQL支持客户端和服务器有多种不同的数据连接:TCP/IP,Unix domain sockets,Windows命名管道。 MySQL++的普通连接对象 Connection 类可以支持上面的全部连接,只要在 Connection::connect() 时指定不同的参数便可。当然,如果开始你就知道连接种类,可以直接使用子类,例如直接使用 TCPConnection 类。

2.2. 查询对象

通常你可以使用 Connection 类对象创建一个SQL查询对象。 Query 查询对象使用方式类似一个C++输出流,所以你可以像使用 std::out 或者 std::ostringstream 一样写入数据。这就是MySQL++创建一个查询字符串时最类似C++的方法。这个库做了文件流处理,这样你可以很容易的创建出正确的SQL语句。 Query 查询对象还支持一个特性,我们称之为模板查询(Template Queries),它用起来就类似C的 printf() 函数。你可以用一些符号标志插入的变量部分。如果你要进行大量相似的查询,可以创建一个模板查询,然后更换其中的变量即可。 第三种创建 Query 查询对象的方式是使用SSQLS。这个特性允许你创建一个C++结构,你同样可以进行INSERT,REPLACE,UPDATE操作,同样也可以生成 SELECT * FROM TableName 的查询,最终将查询的结果保存在一个类似STL容器的SSQLSecs内。

2.3. 结果表

结果表里的数据都保存在一个类似 std::string 的 String 对象中。这个 String 类中有大量简洁的函数能让你很方便的将其转换为C标准数据类型。另外一些MySQL++内定义的类型,例如 DateTime 类型,你也可以轻松的从MySQL的DATATIME 类型直接初始化,MySQL++会自动的进行转换。转换中如果出现错误,你可以设置一个警告或者抛出一个异常,如何处理这种错误取决于你如何设置本库。 虽然MySQL函数返回结果不同,但整体来说,MySQL++里查询返回类型有以下几个主要类型:

  • 无数据返回的查询

并不是所有的SQL查询需要返回数据,例如 CREATE TABLE 。这种类型的查询,将返回一个特殊的返回值类型:SimpleResult 这个返回值会简单的描述一些查询的信息,例如查询是否成功执行,结果有多少行等。

  • 返回MySQL++结构类型的查询

大部分时候,接收一个结果表的方式是使用 Query::store() 函数。这个函数会返回一个 StoreQueryResult 对象,这个对象基于 std::vectormysqlpp::Row,它是一个对Rows做了随机的存储的容器。每一个 mysqlpp::Row 里保存了一个 std::vector 的 String 对象,每一个 String 对象都是一个数据结果。所以,你可以将 StoreQueryResult 看做一个二维数组。例如,你想获取第5列第2行的数据,你可以这样写 result[1][4] ,你同样可以使用元素单元名进行访问,例如,result[2][“priceKey”]; 。 一个简单的执行查询的方式是使用 Query::use() ,它会返回一个 UseQueryResult 对象,这个类类似于一个STL的std::vector 输入迭代。你可以一次性处理结果表里的一行。当你不知道结果表内有多少结果的时候,可以迭代遍历到容器尾。这个特性允许我们获得更好的内存效能,因为查询出来的结果不用保存在RAM中,这对我们获得大容量的结果表时很有意义。

  • 返回MySQL标准结构或自定义结构

使用MySQL++的数据结构来提取数据,的确比MySQL C API方便,但是你可以定一些自己的C++结构以承接数据库中的一些自定义数据。这样的话,就需要你在代码里加入一些原生的SQL代码。 如果你要用自己定义的C++结构,可以下面这样做:

vector v; query << “SELECT * FROM stock”; query.storein(v); for (vector::iterator it = v.begin(); it != v.end(); ++it) { cout << “Price: “ << it->price << endl; }

是不是很简单? 如果你不想创建SSQLSes去承接你的表结构,你可以使用MySQL++ v3提供的一种方式,使用 Mysqlpp::Row 去容载。

vectormysqlpp::Row v; query << “SELECT * FROM stock”; query.storein(v); for (vectormysqlpp::Row::iterator it = v.begin(); it != v.end(); ++it) { cout << “Price: “ << it->at(“price”) << endl; }

这样可以不足够明晰优雅,但也不失为一种方法.

2.4 异常

通常情况下,无论任何地方遇到一个错误,库都会将异常抛出。当然,如果你愿意,你可以对库设置一个错误标示而不再要求抛出,当前异常会提供更多的信息,而不仅仅是一个告诉你为什么异常的一个字符串。异常包括异常的类型等信息,会方便你去进行查找分析。