闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ゆ繝鈧柆宥呯劦妞ゆ帒鍊归崵鈧柣搴㈠嚬閸欏啫鐣峰畷鍥ь棜閻庯絻鍔嬪Ч妤呮⒑閸︻厼鍔嬮柛銊ョ秺瀹曟劙鎮欓悜妯轰画濠电姴锕ら崯鎵不閼姐倐鍋撳▓鍨灍濠电偛锕顐﹀礃椤旇偐锛滃┑鐐村灦閼归箖鐛崼鐔剁箚闁绘劦浜滈埀顑惧€濆畷銏$鐎n亜鐎梺鍓茬厛閸嬪棝銆呴崣澶岀瘈闂傚牊渚楅崕鎰版煟閹惧瓨绀冪紒缁樼洴瀹曞崬螖閸愵亶鍞虹紓鍌欒兌婵灚绻涙繝鍥ц摕鐎广儱鐗滃銊╂⒑閸涘﹥灏伴柣鐔濆懎鍨濋悹鍥ф▕閸氬顭跨捄鐚村姛闁挎稓鍠栧缁樼瑹閸パ冾潻闂佸憡顨嗗ú鐔风暦閸洦鏁嗗璺侯儐濞呮牗绻濋悽闈浶㈤柨鏇樺€濋獮濠囧箛閻楀牆鈧灝鈹戦崒姘暈闁绘挾鍠栭獮鏍箹椤撶偟浠紓浣割槺閺佸寮诲☉姘e亾閿濆倹娅囬柛鏂跨Ф缁辨帡宕掑姣欍垺顨滈鍐ㄥ祮鐎规洖銈搁幃銏ゅ传閸曨偆顔囬梻鍌氬€风粈渚€骞夐敓鐘茬闁硅揪绠戠粈澶屸偓鍏夊亾闁告洦鍋嗛崝锕€顪冮妶鍡楃瑨闁稿﹤缍婂鎶筋敆娓氬洦顔旈梺缁樺姌鐏忔瑧绮绘繝姘厱闁宠桨绀侀顓犫偓瑙勬礃鏋い锕€顕槐鎺楁偐鐎圭姴顥濆銈庝簻閸熷瓨淇婇崼鏇炲耿婵°倐鍋撴い顐㈡喘濮婅櫣绮欓崠鈩冩暰濠电偠灏欓崰搴敋閿濆绠瑰ù锝呮憸椤撳搫鈹戦悩顐壕闁搞劌缍婇弻濠囨晲閸涱垱娈鹃梺璇″灦閸嬪﹤顬婇鍫熲拻濠电姴楠告晶濠氭煕閹捐泛鏋涚€殿喖顭烽幃銏㈠枈鏉堛劍娅撻梻浣风串缁蹭粙寮甸鍕棷闁哄顑欏〒濠氭煏閸繂鏆欓柣蹇d簼娣囧﹪顢曢姀鐘虫闂佷紮绲块崗姗€骞冮姀銈嗗亗妤犵儐鍏橀弲鐘诲蓟閺囩喎绶為柛顐g妇閸嬫捇寮撮埗鍝勵槸椤繈鎳滈悽闈涘箺闂備胶绮弻銊╁箺濠婂牊鍎楀┑鐘插绾捐偐绱撴担濮戭亜霉椤旈敮鍋撶憴鍕鐎光偓閹间胶宓侀柟鐑橆殔缁犲鏌涢幘鑼跺厡婵℃彃娲︾换婵嗏枔閸喗鐏嶉梺鎸庢磵閺呯姴鐣峰⿰鍐f闁靛繆鏅滈弲锝呪攽閻愬弶鈻曞ù婊勭箞閸╂盯骞嬮敂鐣屽幍缂備礁顑呴悘婵嬵敆閵忋倖鐓熼柟鎯у船閸旓箓鏌$仦鍓р槈閾伙綁鏌ゆ慨鎰偓妤呮偂婢舵劖鍊甸悷娆忓缁€鍐煕閵娿儲鍋ラ柣娑卞枛铻i柤娴嬫櫇閿涙粌鈹戦埥鍡楃仯缂侇噮鍨堕幃鐢稿冀椤撶啿鎷绘繛鎾村焹閸嬫捇鏌嶈閸撴盯宕戝☉銏″殣妞ゆ牗绋掑▍鐘绘煙缂併垹鏋熼柣鎾寸懄閵囧嫰寮村Δ鈧禍鍓х磽娴e搫校闁绘濮撮锝夘敃閿曗偓缁犺崵绱撴担濮戭亝绂嶈ぐ鎺撯拺闁兼祴鏂侀幏锟犳煕閹垮嫮鐣电€规洏鍎抽埀顒婄秵閸嬪倻鎹㈤崱娑欑厽闁规澘鍚€缁ㄥ鏌嶈閸撴岸鎮ч弴锛勪罕濠电偠鎻紞鈧い顐㈩樀瀹曪綀绠涘☉娆戝帾闂佸壊鍋呯换宥呂熼崼銉︾厸濞达綁娼婚煬顒勬煛瀹€瀣瘈鐎规洖鐖兼俊鐑藉Ψ瑜岄惀顏堟⒒娴g懓鈻曢柡鈧潏鈺傛殰闁圭儤顨嗙粻鎺楁⒒娴g懓顕滅紒璇插€块獮濠呯疀濞戞ḿ鐤呴梺鍛婄缚閸庡磭澹曢悡搴唵閻犳椽缂氱€氫即鏌涢弬娆惧剰閼挎劙鏌涢妷鎴濈Х閸氼偄顪冮妶鍐ㄧ仾婵炶尙鍠愰幈銊╁焵椤掑嫭鐓冮柕澶堝劚鐢姵绻涢敐搴℃珝婵﹦绮幏鍛驳鐎n亝鐣伴梻浣告憸婵潧鐣濈粙璺ㄦ殾闁硅揪绠戝洿婵犮垼娉涢敃銉╂倵椤掑嫭鈷戦柛娑橈工婵箓鏌涢悩宕囧⒈濠㈣娲熷畷妤呭礂閻撳骸浼庢繝纰樻閸ㄦ澘岣块敓鐘蹭紶婵炲樊浜濋悡鐔兼煙閸喖顏紒澶樺枟閹便劍绻濋崟顓炵闂佺懓鍢查幊妯虹暦椤愶箑唯妞ゎ剦鍠撻崝宀勫煘閹达箑鐓¢柛鈩冦仦缁ㄨ鈹戦悙鐐光偓瀣崲濠靛宓侀柛鎰靛枟閸婄兘鏌i幋鐐嗘垵鈻嶉崶顒佲拺缂佸瀵у﹢鎵磼鐎n偄鐏︾紒鍌氱Т铻栭柛娑卞枓閹锋椽姊婚崒姘卞濞撴碍顨呭嵄闁圭虎鍠楅悡娑㈡煕濞戝崬鏋ら柣顓熷浮閺岀喖顢氶崱娆戠槇闂佽鍠撻崹钘夌暦濡ゅ懏鍤冮柍杞扮缁犱即姊婚崒娆戝妽闁诡喖鐖煎畷鏇㈩敋閳ь剙顕i幓鎺嗘婵炲棙鍩堝ù鍕攽閻樿宸ラ柣妤€锕幃锟犲礃椤忓懎鏋戝┑鐘诧工閻楀棛绮堥崼鐔虹闁糕剝顨婇悰婊堟煠閺夋寧鍋ユ慨濠冩そ椤㈡鍩€椤掑倻鐭撻柟缁㈠枟閸婂潡鏌涢…鎴濅簴濞存粍绮撻弻鐔煎传閸曨厜銉╂煕韫囨挾鐒搁柡灞剧洴閹垽宕妷銉ョ哗闂備礁鎼惉濂稿窗閺嵮呮殾婵炲棙鎸稿洿闂佺硶鍓濋〃蹇斿閿燂拷     婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒姗堣€跨€殿喖顭烽弫鎰緞婵犲孩缍傞梻浣虹帛閿氭俊顖氾工铻炵€光偓閸曨兘鎷洪柡澶屽仦婢瑰棝藝閿曞倹鐓ラ柡鍥ュ妺闁垳鈧鍠栭…鐑藉垂妤e啫绠涘ù锝呮啞閸婎垶姊虹涵鍛汗閻炴稏鍎甸崺鈧い鎺嗗亾缁剧虎鍙冮、娆撳箛閻楀牃鎷婚梺绋挎湰閼归箖鍩€椤掍焦鍊愮€规洘鍨垮畷鍗炩槈濡櫣鈧參姊绘笟鍥у缂佸鐡ㄩ、濠囨⒒娴e憡鍟炴繛璇х畵瀹曡瀵奸弶鎴狀槰闂侀€炲苯澧存慨濠冩そ濡啫霉閵堝棛娲寸€规洏鍔戦、娑橆潩椤掑倻鎲跨紓鍌氬€搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞闁冲搫鍟伴ˇ鈺傜箾閺夋垵鎮戞繛鍏肩懅婢规洜鎲撮崟顓犵槇闂傚倸鐗婃笟妤呭磿韫囨稒鐓㈤柛鎰典簻閺嬫盯鏌$仦璇插闁宠鍨垮畷閬嶅煛閸屽們鍥ㄢ拺闁告繂瀚崳娲煟閹垮嫮绡€鐎殿喛顕ч埥澶娢熼柨瀣垫綌闂備礁鎲¢〃鍫ュ磻閻愮儤鍊剁€广儱顦伴埛鎴︽煕閿旇骞栭柛妯绘綑闇夋繝濠傚暟閸╋絾顨ラ悙鎻掓殭閾绘牠鏌涢幇銊︽珔闁哄鍊垮娲川婵犲啫顦╅梺鍛婃尰閻╊垵妫熼梺闈浥堥弲婊堝煕閹寸姷纾藉ù锝堝亗閹达箑绠氶柛顐犲灮绾捐偐绱撴担璐細缂佺姵鎸婚妵鍕即椤忓棛蓱缂備胶绮换鍌烇綖濠靛鏁囬柣鎰閻╁酣姊绘担钘夊惞闁稿鍋熺划娆撳醇閵夈儳鍔﹀銈嗗坊閸嬫捇鏌涘Ο鑽ゅ缂佹梻鍠栧鎾倷閳哄倹鏉搁梻浣虹帛閸旀牕岣垮▎鎾村€堕柨鏂款潟娴滄粓鐓崶褔顎楃€规挸妫欓〃銉╂倷瀹割喖鍓堕梺杞扮閸熸挳宕洪埀顒併亜閹烘垵鈧悂藟濮樿埖鐓曠憸搴ㄣ€冮崱娑欏亗婵炴垯鍨洪悡鏇㈡煏婢跺牆鐏繛鍛嚇閺岋紕鈧綆鍋呴埛鎺旂磼鏉堛劌娴柟顔规櫊閹筹繝濡堕崶銊︾槖闂傚倷绀侀幖顐︽儔婵傜ǹ绐楅柟鎹愵嚙閻掑灚銇勯幒宥堝厡闁愁垱娲栭悾婵嬫晲閸涱喖浠村Δ鐘靛仜閿曨亜鐣峰鈧、娆撴偩鐏炶棄绠洪梻鍌氣看閸嬪嫬煤閵堝鏅濋柕澶堝劗閺嬪秴鈹戦悩鍙夊闁绘挻绋撻埀顒€鍘滈崑鎾绘倵閿濆骸澧扮悮锔戒繆閵堝洤啸闁稿鍋涢悳濠氬锤濡も偓閻掑灚銇勯幒鎴濐仾婵炴嚪鍥ㄧ厵閻犲泧鍛槇閻庤娲橀懝楣冨煡婢舵劕顫呴柍閿亾闁归攱妞藉娲川婵犲嫮鐣甸柣搴㈠嚬閸樺ジ鏁冮姀鈥愁嚤閻庢稒岣块崢浠嬫⒑閸愬弶鎯堥柨鏇樺€濋幃姗€鏁冮崒娑氬幗濠电偞鍨靛畷顒€鈻嶅鍥e亾鐟欏嫭绀€闁绘牕銈搁妴浣肝旈崨顓犲姦濡炪倖甯掗崐濠氭儗閸℃稒鐓曠€光偓閳ь剟宕戦悙鐑樺亗闁哄洨鍠撶弧鈧梻鍌氱墛缁嬫垿顢旈埡鍛厱闁哄啠鍋撶紒顔芥崌瀵鏁撻悩鎻掔獩濡炪倖鎸荤划灞剧椤斿皷鏀芥い鏃傘€嬮崝鐔虹磼椤曞懎鐏︽鐐茬箻瀹曘劎鈧稒蓱閸庮亪姊洪懡銈呮瀾濠㈢懓妫濋、鏇熺附閸涘ň鎷绘繛杈剧悼閸庛倝宕甸埀顒勬⒑绾拋鍤嬬紒缁樼箞閻涱噣宕橀鑲╋紲闂佺粯鍔︽禍鏍磻閹惧鐟归柍褜鍓欓锝嗙鐎n€晠鏌曟竟顖氭噽瀹撲焦绻濋悽闈浶ラ柡浣告啞閹便劎鈧數纭堕崑鎾斥槈閹烘挻鐝栫紓浣戒含閸嬬偤骞嗛弮鍫濈參闁逞屽墴瀵劍绂掔€n偆鍘介梺褰掑亰閸撴瑧鐥閺屽秶绱掑Ο鑽ゎ槬闂傚洤顦扮换婵囩節閸屾凹浼€闂佹椿鍘界敮妤呫€冮妷鈺傚€烽柡澶嬪灩娴煎矂姊虹涵鍛彧缂侇喗鎹囬獮鍐ㄢ枎閹惧鍔靛┑鐐村灦濮樸劌鈻旈崸妤佲拻闁稿本鐟︾粊鐗堛亜椤愩埄妲搁柣锝呭槻铻i悶娑掑墲閻忓啫鈹戦悙鏉戠仸闁荤啙鍥モ偓鍛存煥鐎n剛鐦堟繝鐢靛Т閸婃悂寮虫繝鍥ㄧ厸闁逞屽墯缁傛帞鈧綆鍋嗛崢鎾绘⒑鐎圭姵銆冪紒鈧笟鈧鎶芥倷閻戞ḿ鍘梺鎼炲劘閸斿海绮婚弽顓熺厵濞撴艾鐏濇俊鐣岀磼缂佹ḿ绠炵€规洏鍔戦、姘跺川椤掆偓閹藉姊婚崒娆掑厡闁硅櫕鎸搁锝夊醇閺囩偟顔囬梺鍛婂姌鐏忔瑩寮抽敃鍌涚厽闁哄啫鍊甸幏锟犳煛娴e憡鍠橀柡宀嬬秮瀵噣宕戦崘鑼Ш鐎殿喗鐓¢獮鏍ㄦ媴閸忓瀚奸梺鑽ゅТ濞层倕顕i崼鏇炶埞濠㈣泛顑冩禍婊勩亜閹扳晛鐒烘俊鍙夋倐閹繝濡舵径瀣幗闂佸搫鍊瑰畷姗€鎳¢敍鍕=闁稿本绋掗惃鎴︽煙閸欏鍊愮€殿噮鍣e畷鐓庘槈閹烘垳澹曟繛杈剧到婢瑰﹤岣块埡鍛仯閺夌偞澹嗙粔鍧楁煏婵炵偓娅嗛柣鎾卞劦閺岋繝宕掑鍙樿檸闂佹娊鏀卞Λ鍐蓟閿濆鏅濋柍褜鍓熼幃褔骞橀幇浣圭稁濠电偛妯婃禍婊呯不瑜版帗鐓熼柟閭﹀幖缁茶鈹戦鑲╃劯婵﹥妞藉畷銊︾節閸愵亜寮崇紓鍌欑椤︿即骞愰幎钘夋槬闁靛繒濯崥瀣熆鐠鸿 鐪嬫繛鐓庯躬濮婃椽妫冨☉姘暫濠碘槅鍋勯惌鍌炵嵁韫囨拋娲敂閸涱垰骞楅梻浣虹帛閿氶柛妯荤墵閹虫粓顢旈崼鐔哄幈闂佸搫鍊介崕鑽も偓姘嵆閺屽秶鎷犻懠顑勵殽閻愬弶鍠橀柟顔ㄥ洤閱囬柕蹇曞Т缁犮儵姊婚崒娆戭槮闁硅绻濆畷褰掝敍閻愯尙锛欓梺鍝勭▉閸嬧偓闁稿鎸搁~婵嬫倷椤掆偓椤忥拷

45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:如何运用设计模式实现Sql语句动态转换?

如何运用设计模式实现Sql语句动态转换?

2016-08-31 05:15:06 来源:www.45fan.com 【

如何运用设计模式实现Sql语句动态转换?

由于系统面向客户的实际情况不同,对数据库的选择上,有的偏向于Sql Server的易用性和可维护性,有的偏向于Oracle的健壮性和稳定性,而现有代码中Sql语句都大量应用服务器端的函数和关联(Oracle),这些函数调用的名称、参数等在这不同数据库中有很大的差别。如果为每种数据库去维护一份代码,将来的维护成本将会越来越高;如果要有功能的升级,对代码的修改量将是几何级数的增加。

对于这个问题,开始的设想比较简单,在执行Sql语句前,首先检查当前所连接的数据库,如果是Oracle则不作任何干涉,如果是连接SqlServer只要把Sql语句中不相同的关键字和函数名替换掉,如Oracle中的To_Date换成SqlServerConvert,就可以在SqlServer上执行了,对一些简单的Sql语句这样确实可以,可是对系统中大量复杂报表的应用来说,Sql语句可能多层嵌套,函数也有多层嵌套,如果只是简单的替换,将会有无数的if else,并且出错后的修改和调试几乎是不可能的。

通过对OracleSqlServer两种数据库的Sql语法的研究比较,认为必须采用语法分析,把Sql语句解析为一棵语法树,然后再按照语法的转换规则把sql语句转换到SqlServer上可执行的语句。要实现这样的功能,需要用到的模式有:

1.
INTERPRETER(解释器)—类行为型模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。通过实现解释器模式,把要执行的Sql语句解释为Sql的语法树。例如一个Select语句的结构如下

如何运用设计模式实现Sql语句动态转换?

从这张结构图中可以看到,Sql语句可能出现非常复杂的组合结构,如果不使用语法树表示,很难实现不同数据库平台的转换。在系统中,调用Sql语句转换功能的是TAdoDataSetTAdoQuery,也就是模式中的Client。所以运用该模式的类关系如下

如何运用设计模式实现Sql语句动态转换?

2.COMPOSITE(组合)—对象结构型模式:将对象组合成树形结构以表示“部分-整体”的层次结构。C o m p o s i t e使得用户对单个对象和组合对象的使用具有一致性。

从上面的Sql语句的语法结构可以看到一个查询语句可能是很简单的select * from ATable,也可能在sql里面又包含其他的Sql语句。按照组合优先于继承的规则,并没有给单独的Sql和复合的Sql语句创建不同的类,而是在内部组合并递归引用自己的定义,对访问语法树的客户代码来说,并不需要了解所访问的Sql语句是否存在复合结构。

如何运用设计模式实现Sql语句动态转换?

3.VISITOR(访问者)—对象行为型模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。前面已经通过解释器模式解析Sql语法,用组合模式来存储解析的语法树,但是我们所需要的不仅如此。还要按照SqlServer的语法结构把语法树上的各个节点重新组合,最终输出SqlServer上可以执行的Sql语句。例如:Oracle中的一句连接查询select a.*,b.* from a,b where a.id=b.id(+),SqlServer中对应的语句应该是select a.*,b.* from a left join b on a.id=b.id。从这个简单的例子中可以看到对于表的左连接或右连接,两种数据库的语法结构存在较大的差异。如果是在TSql类中写某个方法,由这个方法遍历语法树上的每个节点,并按照SqlServer的语法结构组合所需要的结果,是可以达到这个目的的。可是如果需要从这棵语法树导出其它数据库上如sybase可执行的sql语句呢,那又要在TSql类中再增加新的遍历算法,所有的相关代码又要重新编译。通过采用访问者模式,把遍历节点时组合语法树节点的算法封装再访问者的方法中,如SqlServer的语法就是一个TSqlServerVisitor类,语法树遍历每个节点时,都会调用它的Visit方法,全部访问完后即可通过GetSql得到所需要的Sql语句。这时如果我们需要转换到Sybase,只需要再实现一个TSybaseVisitor类,并传给语法树,就可以得到sybasesql语句了.

 

 

本文地址:http://www.45fan.com/a/question/70091.html
Tags: 实现 sql 动态
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部