一万光年外  
免费OA软件网 http://www.freeoasoft.com 专注于平台架构设计及OA软件开发
公告
  • 昵称:一万光年外
    园龄:6年5个月
    粉丝:5
    关注:1
日历
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567
统计
  • 随笔 - 22
  • 文章 - 0
  • 评论 - 229
  • 引用 - 4

导航

搜索

 

常用链接

最新随笔

随笔分类(25)

随笔档案(22)

相册

友情链接

积分与排名

  • 积分 - 36973
  • 排名 - 2901

最新评论

阅读排行榜

评论排行榜

推荐排行榜

 

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

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 一万光年外 阅读(1528) 评论(7) 编辑 收藏
评论:
  • #1楼  jisen       Posted @ 2009-02-11 21:26
    做一个结构化的工具,程序根据用户操作完成T-sql的撰写,最好不要解析sql得到xml  回复 引用 查看   

  • #2楼[楼主]  一万光年外       Posted @ 2009-02-11 21:33
    @jisen
    可能你没看明白我在这里要说的意思,我是想提供一种可操作不同数据库的通用SQL语句,而不是根据业务规则自动生成SQL语句,这是两种不同的需求
     回复 引用 查看   

  • #3楼  韦恩卑鄙       Posted @ 2009-02-12 12:30
    lz做的是linq做的事情啊 不过变成xml 只是为了xslt 只要不用 xslt 是不是xml 也没有什么限制 自己建立语法正则也可以 linq语法也可以么  回复 引用 查看   

  • #4楼[楼主]  一万光年外       Posted @ 2009-02-12 13:14
    @韦恩卑鄙
    不完全是这个意思
    我们说ORM,一般有三个技术点
    1. 映射,即把表映射的实类,这个是好是坏每个人都有不同看法,这里我们不讨论它
    2. 根据业务规则,如ORM的实体类自动自成SQL,这一块比较麻烦,因为要为每一种数据库生成不同的SQL
    3. 在程序中直接写数据库操作语句,如NHibernate的HQL,LINQ的查询等,但目前只支持查询,不支持其它的语句(不知道最新版有没有支持Insert,好久没关注)

    而我想说的是:用一种特殊方法生成能够操作不同数据库的SQL语句
    至少这种方法有两个好处:
    第一:扩展容易
    第二:代码少,LINQ不知道有多少代码,NHibernate的相关代码至少是以十万行为单位来计的吧
     回复 引用 查看   

  • #5楼  韦恩卑鄙       Posted @ 2009-02-12 15:44
    @一万光年外
    我的意思不是说orm

    你这种把抽象语言转化为具体sql的方式

    是 linq 的一部分

    但是如果你放弃xslt 就没有xml
    直接用对象建立 一个正则语法树 也是行得通的
     回复 引用 查看   

  • #6楼[楼主]  一万光年外       Posted @ 2009-02-12 16:46
    @韦恩卑鄙
    你说的是没问题,但还是不是我要说的,我想说的是每种数据库因为支持标准的不一致,需要针对每种数据库写一些专门的转换,比如说如果要通过对象自动生成一个取出前5条的查询语句

    如果是SQLSERVER,大致语法为: select top 5 * from tb
    而如是MYSQL,则为: select * from tb limit 5
    如是Ocacle,则又不同,不过我不会写,^_^

    明白我这篇文章想要表达的意图了吗?
     回复 引用 查看   

  • #7楼  anycall[未注册用户] Posted @ 2009-05-11 01:06
    想法不错,不过始终感觉这个功能有点过,
    感觉不用把时间浪费在实现这个功能上面,试想,真正项目中,有多少个会遇到需要转换其他数据的,在中小企业的应用中,这种更是少,而且现实应用中,盗版情况严重,你叫要用系统的公司装一个盗版的Sql Server,他们也没什么意见。就算遇到了,把里面的Sql重写一遍,也不过分。
    写这个功能,个人感觉倒不如写一个系统Sql管理器,把系统中的所有Sql楸出来,提供像多语言那种方案,这样降低了系统的复杂性
     回复 引用   

 
Copyright © 一万光年外 Powered by: 博客园 模板提供:沪江博客
免费OA软件网 http://www.freeoasoft.com 专注于平台架构设计及OA软件开发