Mysql++提供了很多种复杂但强有力的数据库使用方法,但本质上和其他的数据库操作API没太大不同

基本模式:

1.打开一个连接

2.格式化执行查询

3.如果成功,遍历结果集

4.否则,处理错误

每一步都对应一个Mysql++类或类集

连接对象

一个连接对象管理一条到Mysql服务器的连接,你至少需要一个这样的对象来执行其他操作。因为其他Mysql+对象都间接依赖于一个连接实例,所以,该对象的生命周期必须至少和其他对象一样长。Mysql支持支持多种客户端到服务器的数据连接:TCP/IP,Unix域套接字,Windows命名管道.连接类根据你所传递参数确定连接类型,如果你明确知道所要使用的连接类型,可以直接使用接口更简单的子类。

查询对象

通常情况下,你使用一个被连接对象创建的查询对象来建立SQL查询

查询对象的运用类似一个标准C++输出流,因此你可以像std::cout或者std::ostringstream一样写数据。这是Mysql++提供的构建查询串的最有C++特征的方式,库提供了类型敏感的流操作符,因此,很容易构建动态-正确的SQL语句。

查询对象也提供类似C的printf()函数的模版查询:建立一个包含变量的修正串,如果你的查询结构类似,你就可以建立一个模版查询。

第三种方式是使用SSQLS,这种特性可以让你创建C++结构来设立你的数据模式。可以在给定SSQLS模式数据的情况下INSERT,REPLACE, UPDATE表中行,也可以产生SELECT * FROM SomeTable的查询并且将结果保存到一个SSQLSes的STL中。

结果集

结果集合中的字段数据被保存为一种特殊的类似std::string的类:String。该类有些基本操作,支持到任意C基础类型转换,Mysql++还定义了可以用来初始化Mysql DATETIME串的类:DateTime。这些自动的转换操作会通过警告或者异常来防止转换的滥用。

不返回数据的查询

不是所有SQL查询都会返回数据,CREATE TABLE就不会。对于这种类型的查询,有一个特殊的类型(SimpleResult)会报告返回状态:成功有否,有多少行被改变

返回数据的查询:MySql++数据结构

最直接的取回结果集的方法就是使用Query()::store().它会返回一个StoreQueryResul对象,该对象继承自std::vector<mysqlpp::Row>,提供对Rows容器的随机访问,每一个Row对象都是一个类似std::vector<String>的对象,每个对应结果集中的一个字段。可以将StoreQueryResult看作是一个二维数组:通过result[1][4]获取第二行第5个字段。也可以通过行和字段名访问:result[1]["price"].

一个不太直接的获取查询结果集的方式是使用Query::use(),它将返回一个UseQueryResult对象。该类像STL输出迭代器一样工作,只能提供顺序访问,不能搜索,访问结束前总数未知,但它的内存更高效,适合返回大的结果集

返回数据的查询:专用 SQL结构

通过MySql++的数据结构访问查询的返结果是一种比较低层次的抽象,只是比使用MySql的C API稍微好点,SSQLS提供一种更接近问题本身的特性.它允许你定义C++结构来对应你数据库中的表结构,并且SSQLSes提供普通STL容器及算法的使用。

这种方式的优势在于你的代码将会嵌入更少的SQL代码,你可以轻易的用C++结构执行一个查询,并且返回结果,其操作就像任意其他结构一样。结果可以通过Row对象来访问,或者你可以让库将结果放入任何容器-----顺序,关联容器都可以

1 vector<stock> v;
2 query << "SELECT * FROM stock";
3 query.storein(v);
4 for (vector<stock>::iterator it = v.begin(); it != v.end(); ++it) {
5 cout << "Price: " << it->price << endl;
6 }

如果你不想创建SSQLSes结构来对应表结构,MySql++ 3以上版本支持用Row代替:

1 vector<mysqlpp::Row> v;
2 query << "SELECT * FROM stock";
3 query.storein(v);
4 for (vector<mysqlpp::Row>::iterator it = v.begin(); it != v.end(); ++it) {
5 cout << "Price: " << it->at("price") << endl;
6 }

异常

默认,库在遇到错误时会抛出异常,你也可以让它设置错误标识位,不过异常会携带更多信息,一条指明错误发生的串,几种异常类型可供你分辨。