一万光年外  
免费OA软件网 http://www.freeoasoft.com 专注于平台架构设计及OA软件开发

接到了工作室成立后的第一个任务,三人愁眉不展的坐在了工作室的会议室中。投影幕上显示的是第一个任务的要求:

1.     写一个能够操作多种异构关系数据库的中间件

2.     支持在程序中直接书写Insert、Update、Delete、Select等常见语句的能力

3.     要求可在不改动程序的情况下提供对未知关系数据库支持的能力

说明:以上所指的关系数据库是指符合相关SQL标准的关系数据库

 

姚鑫辰问:“不知两位可有办法?”

 

爱找碴爱理不理的道:“这个任务太难了,我看是他们故意找碴,我估计是没什么希望了,干脆散伙得了!”又小声嘀咕:“又不是我要回家,反正我无所谓!“

 

姚鑫辰无助的看向包打听:“包打听,你可得帮我啊,我的前程全压在你的头上了!“

 

包打听:“实现第一个目标不难,现正流行的ORM框架都有现成的实例,比如业界(C#)最出名的NHibernate就实现了对常见关系数据库的支持,而且还有源码,要是只有第一个目标,直接COPY过来就行了!不过…“

 

包打听顿了一顿,继续说道:“至于第三点,NHibernate的HQL现倒是支持Select,暂时还不支持Insert、Update、Delete,何况还有一个‘等’字!说道支持Insert、Update、Delete,Hibernate倒是支持,不过那是JAVA的东西,但也不支持’等’啊!至于第二点,NHibernate就更不可能了,而且好像我还没有听过能够已经做到这一点的!”。

 

“那就是不可能了?” 姚鑫辰灰心的道。

 

包打听:“不是说不可能,是没有现成的东西!况且不是我说你,兄弟!做事情不能老是灰心丧气的,我觉得人生其实特短暂!”喝了口水,包打听继续说道:“眼睛一闭,一睁,啊哈,一天就过去了;眼睛一闭,没睁,一辈子就过去了。你不像我们NPC,想死都不能,简直是他妈的生不如死啊!”

 

包打听用只能自己听得见的声音小声嘀咕:“要不谁愿意加入你的工作室啊,这不是没事找事干嘛!”

 

“我靠,意思是死还是一种幸福啊!” 姚鑫辰苦笑,振作道:“不过前面那句话倒是说对了,世上无难事,只怕有心人!我决不可以放弃!”

 

包打听:“这样就对了嘛!其实我们碰到了问题,可以慢慢分析考虑嘛,比如说第二点,要提供在不改动程序的情况下提供支持未知关系数据库,其实就隐含了配…”

 

姚鑫辰兴奋的打断:“对,配置!就是配置,要提供在不改变程序的情况下更改程序行为,只有通过配置来实现!”顿了顿,又继续想道:“我们是不是可以这样想,要求支持的不同的关系数据库都有一个共同点,就是都支持相关SQL标准,只是具体的顺序和关键字及函数等可能有不同,就像普通话与地方语言一样,比如普通话你先走,广东话是你走先,普通话说什么,广东话是乜嘢…”

 

“对啊,思路正确!如果我们要把普通话翻译成广东话,那应该…”包打听继续提示道。

 

姚鑫辰兴奋道:“借助翻译机!其实也就是一段翻译程序,是不是我们也可以这样理解,我们可用标准SQL或某一数据库语言为标准,然后通过翻译程序把标准语言翻译成对应关系数据库的语言就行了!”,想了想道:“不过,这个翻译程序可不是简单的事啊!包打听,你有好的办法吗?”

 

包打听:“说到翻译,我倒是有个新想法,就是不知可不可行?”

 

姚鑫辰:“什么新想法,说来听听!”

 

包打听:“你知道XSLT吧?”

 

姚鑫辰:“知道啊,现在有很多网站都用XSLT+XML来做啊,据说这样更能使界面和数据分离,其原理就是解析引擎通过XSLT样式把XML数据翻译成HTML网页啊!对了,等等!我知道了!”

 

姚鑫辰跳了起来,激动的说道:“我们把标准的SQL语言解析成XML树状结构,然后针对每种不同数据库分别写一份XSLT样式文件,解析引擎就能把XML树状结构的SQL语言转成对应的数据的语言!”

 

姚鑫辰兴奋得跳了起来,说道:“ 我觉得这种方案可行!因为解析引擎可直接用现成的,需要做的工作只是把标准SQL解析成XML,然后针对不同数据库写不同的XSLT就行了,嗯!工作量应该也不算太大!并且能满足所有的要求,支持未知数据库也不要改程序,只需要写对就数据库的XSLT就行了!”高兴道:“这个方案好,就用这个方案了!”

 

几分钟后,还没有从激动中恢复过来,继续说道:“下面我以实际为例来进行简单模拟!”

 

“首先,我们就以T-SQL为标准吧,比如说’select top 1 * from tb’这样一句T-SQL语句,我们首先把它解析成类似以下的XML样式:

<select>

    <top>1</top>

    <list>

        <column>*</column>

    </list>

    <from>tb</from>

</select>

 

喝了一口水,继续说道:“比如我们要把这个XML转成MYSQL语法,因为MYSQL没有TOP,而是在语句的最后用Limit限制记录数,所以需写类似以下的select的转换样式:

<xsl:template match="select">

select

    <xsl:if test="@top">

      limit <xsl:value-of select="@top"/>

</xsl:if>

</xsl:template>

 

顿了一顿,接着说道:“然后通过XslCompiledTransform类进行转换就行了!”

 

“愿望是美好的,现实是残酷的,实际情况恐怕不是这么简单吧!”爱找碴阴阳怪气说道。

 

“这是自然,不过只要我们认准方向,排除万难,坚持到底,就一定是胜利!” 姚鑫辰满怀信心,说道:“今天晚了,明天我们就开始吧!”

 

 

若干时间以后,鑫辰工作室终于完成了它的第一个任务!也正式进级到B级,虽然离S级还有一段距离,离回家还有更漫长的路要走,但我们的主角却信心满满,因为他坚信:

 

坚持到底,就一定是胜利!

 

 

Ps:上述所说的支持异构数据库方法是我偶而想到的,我写了个示例程序,目前仅支持select和insert,又因我只熟悉SqlServer,转换的XSLT也只是乱写的,如有朋友需要源码研究,可留下EMAIL,不过如完善后,别忘记给我一份!谢谢!

 

 

 

作者: 一万光年外 欢迎交流

邮箱:   freeoasoft@126.com

Blog:   http://www.cnblogs.com/yaozy/

主页:   http://www.freeoasoft.com

 

posted on 2009-02-11 20:52  一万光年外  阅读(1795)  评论(7编辑  收藏  举报
 
免费OA软件网 http://www.freeoasoft.com 专注于平台架构设计及OA软件开发