注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

永恒的遗失古都-亚特兰蒂斯

一个游戏开发者的个人博客。

 
 
 

日志

 
 

MySQL++V3.1.0 用户手册 <五>  

2011-08-11 17:56:00|  分类: 服务器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

5. SQL 专属结构

专属SQL结构(SSQLS)特性允许你方便简单的将定义的C++结构存储到SQL表中。从表面上来看,一个SSQLS每一个成员变量对应了SQL表中的每一个字段。但是,其实SSQLS里同样有一些函数方法,操作和MySQL++使用的数据成员,这些我们将在这一章节进行讲解。
你可以通过 ssqls.h 里面的一些宏来定义 SSQLS 结构。这是唯一一个没有被 mysql++.h 头文件包含的MySQL++头文件。如果你使用了SSQLS特性,你需要自己在项目中包含这个头文件。

5.1. sql_create

我们看一下下面的这个SQL表结构

CREATE TABLE stock (
    item CHAR(30) NOT NULL,
    num BIGINT NOT NULL,
    weight DOUBLE NOT NULL,
    price DECIMAL(6,2) NOT NULL,
    sdate DATE NOT NULL,
    description MEDIUMTEXT NULL)

你可以创建一个类似于该表的C++结构,如下:

sql_create_6(stock, 1, 6,
    mysqlpp::sql_char, item,
    mysqlpp::sql_bigint, num,
    mysqlpp::sql_double, weight,
    mysqlpp::sql_decimal, price,
    mysqlpp::sql_date, sdate,
    mysqlpp::Null<mysqlpp::sql_mediumtext>, description)


声明 stock 结构,然后为SQL每一列声明一个同名的数据成员。这个结构同样还有一个成员函数,操作着隐藏的数据成员,我们暂时不讲。
在参数之前我们调用了一个 sql_create ,然后使用了C++数据类型保存了SSQLS的数据。当然,这里没有使用标准C++类型,我们更希望你使用MySQL++定义的数据类型,而不是标准C++的。
有时候你不得不用MySQL++内的数据类型,例如 SQL 里的NULL,这个“未定义”值是无法使用C++类型声明定义的。但是MySQL++里等译了Null模板,可以区分两种不同的Null.
Sql_create 宏定义如下

sql_create_#(NAME, COMPCOUNT, SETCOUNT, TYPE1, ITEM1, ... TYPE#, ITEM#)

其中NAME是你准备创建的结构,TYPEx 是你创建的字段类型,ITEMx 则是你创建的字段名称。其中的 COMPCOUNT 和 SETCOUNT 我们在下面的章节说明。
 
5.2. SSQLS的初始化和比较

Sql_create 宏其实定义了成员函数以便你和另外一个SSQLS实例进行比较。这个函数实际比较的是两个SSQLS结构中的 COMPCOUNT
编号的变量。在上面那个例子里,COMPCOUNT 是 1,所以如果两个SSQLS实例比较的话,则仅仅比较的是 item 这个字段的值。如果COMPCOUNT是2,在上面的那个例子里,比对俩实例的时候,则需要比较 item 和 num 这两个字段的值。
所以非常推荐,你将SQL中“Key”字段作为 COMPCOUNT。
COMPCOUNT必须大于等于1。
另外 sql_create 函数不能创建一个没有 COMPCOUNT 的 SSQLS 对象。
我们也可以使用容器和STL数学方法进行结果的一些查询处理,就如同 SQL 容器的处理一样:

std::set<stock> result; 
query.storein(result);
cout << result.lower_bound(stock("Hamburger"))->item << endl;

这将输出以 “Hamburger” 开头的结果数据的 item 字段。
Sql_create 的第三个参数是 SETCOUNT。如果这个值不是 0, 它将为结构增加一个初始化构造函数,同时增加一个 set() 成员函数,可以初始化结构中的前几个参数。我们看下之前的例子,现在我们修改一下 SETCOUNT ,如下:
 


sql_create_6(stock, 1, 2,
    mysqlpp::sql_char, item,
    mysqlpp::sql_bigint, num,       
    mysqlpp::sql_double, weight, 
    mysqlpp::sql_decimal, price, 
    mysqlpp::sql_date, sdate,
    mysqlpp::Null<mysqlpp::sql_mediumtext>, description)

stock foo("Hotdog", 52);

除了一个2个参数的构造函数之外,这个SSQLS结构内其实还有一个两个参数的set()成员函数,作用类似于这个构造函数。

注意,COMPCOUNT 和 SETCOUNT 的值不能相同。如果它们相同的话,这个宏将创建两个同样参数列表的初始化构造函数,这在C++中是禁止的。你可能会问,为什么要为比较这个功能做一个构造函数?这是为了方便我们使用类似 x == stock(“HotDog”) 的操作。这就要求我们使用 COMPCOUNT 个参数创建一个构造函数。
这个限制在实际中并不会带来太多问题,如果你需要同样数量的参数进行比较,也需要同样数量的参数进行初始化,你只需要将 SETCOUNT 设置为 0,这样的话,就不会出现上述的冲突了,但是SETCOUNT个参数的初始化构造函数依旧存在了(被COMPCOUNT创建了),例如

sql_create_1(stock_item, 1, 0, mysqlpp::sql_char, item)

 

 

 

 

 

 

 

-----------------

TODO:大运放假,回去休息弄别的代码了。

-----------------

2011-9-18 FreeKnight Add

开启新章节。请参考MySQL++ V3.1.9 用户手册<六>

  评论这张
 
阅读(21)| 评论(7)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018