这节,我们来分析Dataset这个东西,这是MX 2004数据库编程框架里面灵魂性的组件,是核心。MM的Flash 2004出来的很晚,故此它有机会从微软的.NET和Sun的J2EE中吸取了不少养分。Dataset就是MM博采众长后搞出来的一个非常棒的数据库组件。
(1)Dataset的首要功能是在内存中部分或全部的缓存数据库镜像,缓存是提高数据库应用程序性能的最主要的途径,也是Flash应用程序区别于HTML类应用程序的一个重要特征,HTML是无状态(Stateless)语言,当你请求下一个页面的时候,前面的状态就不存在了,由服务器从新产生所有的状态,它的坏处很多,比如我们经常碰到这样的情况,某网站让你填大堆的注册信息,一页一页,好多页,你填到一半的时候,忽然网络延时,表单发不出去,怎么办?退回上一页吗?不行了,因为安全性的缘故,上一页已经过期(Expired)了,你进也不行,退也不行,怎么办?只好从头填起。还好你只是在填你的注册信息,要是你正在在线做笔交易,那方方面面的问题就大了。这也是HTML最被人诟病的地方,Flash 程序就没有这个问题,因为只要你不关了它,它的状态一直保持。Dataset就是用来保持本地数据库状态的一个很好的途径,网络延时或者暂时网络不通,没问题,咱等网络好了,再和远程数据库进行同步,你不用担心会丢失重要的数据。
(2)Dataset的另一个功能是将不同质的数据库同质化。比如一个大公司,以前它的各子公司各自为政,分别做了一套管理系统,数据区也千差万别,从Access, MySQL,SQLServer到DB2千七百怪的都有,总公司要统一做一套管理系统,但把所有数据库升级的代价很大,怎么办呢?我们可以在通过第二节所说的连接器,把不同数据源的原始数据读到Dataset中,那么对于客户端而言,数据源的差别就被弥合了,它们就被同质化,你就像操作单个数据库一样,方便得对多个数据库进行操作。
(3)数据格式转换,数据库里的原始数据往往不能直接显示,而需要经过转换,最简单的例子就是日期,数据库返回回来的日期往往是一串长长的精确到毫秒的甚至带有时区的字符串,通常你要对它处理一下,插进去“年”,“月”,“日”等符合国人阅读习惯的文字,在Dataset中,你可以对每一个字段指定一个编码(Encoding),它可以帮你把原始数据翻译成你想要的格式。你也可以订制编码器,比如:
if (积分 < 20)
return 菜鸟;
else
reutrn 老鸟;
这样“积分”这个字段通过编码器就被转换成了大家更能理解的文字。
(4)Dataset最强悍的功能当属它自动产生更新脚本这一项。通常的数据库应用程序,当用户做了一些修改后,你需要逐一的把它们更新到数据库里去,其过程用伪代码可能如下:
for (被修改的每一行)
如果它的状态是“新增”,就执行Server.AddNew(...)
如果它的状态是“被删除”,就执行Server.Delete(...)
如果它的状态是“被更新”,就执行Server.Update(...)
Dataset则不然,你把它里面的字段绑定到UI Component上后,在UI Component上做修改,Dataset会在相应的纪录(Record)和字段(Field)上做标志,然后当用户要求将修改保存到数据库的时候,Dataset把所有的修改打包,假设你事先已经将Dataset的dataPacket属性和XUpdateResolver的dataPacket属性绑定,那么当程序执行到resolver.ApplyUpdate()的时候,resolver会把DataSet的修改脚本转化成XUpdate命令发送到服务器,让服务器端程序执行相应的修改命令,并返回结果。