惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
宝玉的分享
宝玉的分享
Microsoft Security Blog
Microsoft Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
量子位
博客园 - 叶小钗
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
D
DataBreaches.Net
Vercel News
Vercel News
博客园 - Franky
Recorded Future
Recorded Future
B
Blog RSS Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
GbyAI
GbyAI
M
MIT News - Artificial intelligence
F
Full Disclosure
S
SegmentFault 最新的问题
L
LangChain Blog
F
Fortinet All Blogs
美团技术团队
IT之家
IT之家
博客园 - 司徒正美
Cyberwarzone
Cyberwarzone
NISL@THU
NISL@THU
P
Privacy International News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Y
Y Combinator Blog
C
Check Point Blog
The GitHub Blog
The GitHub Blog
L
Lohrmann on Cybersecurity
I
Intezer
I
InfoQ
Spread Privacy
Spread Privacy
Project Zero
Project Zero
T
Threatpost
S
Secure Thoughts
C
Comments on: Blog
N
News | PayPal Newsroom
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Heimdal Security Blog
T
The Blog of Author Tim Ferriss
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Hugging Face - Blog
Hugging Face - Blog
U
Unit 42

博客园 - 一万光年外

戏说平台 第七章 可插拔主控台 心情极度不爽,发几句牢骚,恳请放首页一天 戏说平台 第六章 煮酒论编程 戏说平台 异构外篇 与朋友的QQ聊天记录 戏说平台 第四章 淫贱二人组 戏说平台 第三章 学艺 CDMP平台简介 PPT格式 戏说平台 第二章 拜师 戏说平台 第一章 穿越 可配置B/S,C/S两用平台之三:自定义业务续 可配置B/S,C/S两用平台之二:自定义业务 可配置B/S,C/S两用平台之一:系统概览 Ado.net处理数据库异常 Byte[]转十六进制 Action设计模式的.Net实现 安装SQL SERVER2000时出现程序挂起错误的解决方法 老生常谈,设计模式之我见 - 工厂模式篇 转载fyireporting Reporting Services主从表实现
戏说平台 第五章 异构 一种独特的实现异构数据库操作的方法
一万光年外 · 2009-02-11 · via 博客园 - 一万光年外

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

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