|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
BDB源自BerkeleyDB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性 关于这个成绩,入手下手的假想对照复杂,大抵历程是:把Sql语句中不不异的关头字和函数名交换失落,如Oracle中的To_Date换成SqlServer的Convert,就能够在SqlServer上实行了.对一些复杂的Sql语句如许的确能够,但是对庞大的使用来讲,Sql语句大概多层嵌套,函数也有多层嵌套,假如只是复杂的交换,代码中一定会有没有数的ifelse,而且堕落后的修正和调试几近是不成能的。 经由过程对Oracle和SqlServer两种数据库的Sql语法的研讨对照,以为必需接纳语法剖析,把Sql语句剖析为一棵语法树,然后再依照语法的转换划定规矩把sql语句转换到SqlServer上可实行的语句。要完成如许的功效,必要用到的形式有:
1.INTERPRETER(注释器)―类举动型形式:给定一个言语,界说它的文法的一种暗示,并界说一个注释器,这个注释器利用该暗示来注释言语中的句子。经由过程完成注释器形式,把要实行的Sql语句注释为Sql的语法树。比方一个Select语句的布局以下
从这张布局图中能够看到,Sql语句大概呈现十分庞大的组合布局,假如不利用语法树暗示,很难完成分歧数据库平台的转换。
2.COMPOSITE(组合)―工具布局型形式:将工具组分解树形布局以暗示“部分-全体”的条理布局。Composite使得用户对单个工具和组合工具的利用具有分歧性。
从下面的Sql语句的语法布局能够看到一个查询语句多是很复杂的select*fromATable,也大概在sql内里又包括其他的Sql语句。依照组合优先于承继的划定规矩,并没有给独自的Sql和复合的Sql语句创立分歧的类,而是在外部组兼并递回援用本人的界说,对会见语法树的客户代码来讲,其实不必要懂得所会见的Sql语句是不是存在复合布局。
3.VISITOR(会见者)―工具举动型形式:暗示一个感化于某工具布局中的各元素的操纵。它使你能够在不改动各元素的类的条件下界说感化于这些元素的新操纵。
后面已经由过程注释器形式剖析Sql语法,用组合形式来存储剖析的语法树,可是我们所必要的不但云云。还要依照SqlServer的语法布局把语法树上的各个节点从头组合,终极输入SqlServer上能够实行的Sql语句。比方:Oracle中的一句毗连查询selecta.*,b.*froma,bwherea.id=b.id(+),在SqlServer中对应的语句应当是selecta.*,b.*fromaleftjoinbona.id=b.id。
从这个复杂的例子中能够看到关于表的左毗连或右毗连,两种数据库的语法布局存在较年夜的差别。假如是在TSql类中写某个办法,由这个办法遍历语法树上的每一个节点,并依照SqlServer的语法布局组合所必要的了局,是能够到达这个目标的。但是假如必要从这棵语法树导出别的数据库上如sybase可实行的sql语句呢,那又要在TSql类中再增添新的遍历算法,一切的相干代码又要从头编译。
经由过程接纳会见者形式,把遍历节点时组合语法树节点的算法封装再会见者的办法中,如SqlServer的语法就是一个TSqlServerVisitor类,语法树遍历每一个节点时,城市挪用它的Visit办法,全体会见完后便可经由过程GetSql失掉所必要的Sql语句。这时候假如我们必要转换到Sybase,只必要再完成一个TSybaseVisitor类,并传给语法树,就能够失掉sybase的sql语句了。
4.无限形态机--单词和关头字的辨认.在剖析一句sql语句前,先要把个中的字符、数字、关头字和函数等语法元素辨认出来。这明显不克不及复杂的用字符定位等来判别,而必需用形态机来辨认分歧的划定规矩表达式。这方面如今c#里的划定规矩表达式就很好用了。不外经由重写这些形式辨认,也把之前学的编译道理好好温习了一遍,对有些观点的了解更深切一些,只怪现在学的还不敷精啊。呵呵。
外洋较成熟的sql翻译器参考:http://www.microsoft.com/downloads/thankyou.aspx?familyId=E35CEE88-C919-463F-B020-81468CD231DA&displayLang=en
http://www.ispirer.com/products
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。 |
|