在開(kāi)發(fā)項(xiàng)目的時(shí)候,往往碰到的不同的需求情況铐料,兼容不同類(lèi)型的數(shù)據(jù)庫(kù)是我們項(xiàng)目以不變應(yīng)萬(wàn)變的舉措之一钠惩,在底層能夠兼容多種數(shù)據(jù)庫(kù)會(huì)使得我們開(kāi)發(fā)不同類(lèi)型的項(xiàng)目得心應(yīng)手,如果配合快速的框架支持坦刀,那更是錦上添花的舉措鲤遥。我開(kāi)發(fā)的項(xiàng)目或者框架盖奈,采用了微軟企業(yè)庫(kù)Enterprise Library的模塊拔第,傾向于支持多種數(shù)據(jù)庫(kù)蚊俺,也為我們開(kāi)發(fā)不同類(lèi)型的項(xiàng)目提供非常方便批钠、快速、統(tǒng)一的處理方式拷呆。一般常規(guī)的數(shù)據(jù)庫(kù)包括MS Server茬斧、Oracle、MySQL娄蔼、PostgreSQL、SQLite唉侄、DB2、國(guó)產(chǎn)達(dá)夢(mèng)等數(shù)據(jù)庫(kù)野建,本篇隨筆主要介紹如何實(shí)現(xiàn)從MS SQLServer到Mysql數(shù)據(jù)庫(kù),并為不同數(shù)據(jù)庫(kù)類(lèi)型添加實(shí)現(xiàn)底層的解決思路恬叹。
1候生、SQLServer數(shù)據(jù)庫(kù)導(dǎo)出到MySQL
如果我們已經(jīng)基于SQL Server進(jìn)行了開(kāi)發(fā),并且具有很多基礎(chǔ)的數(shù)據(jù)庫(kù)數(shù)據(jù)了绽昼,那么我們可以利用SQL Server導(dǎo)出到MySQL數(shù)據(jù)庫(kù)中唯鸭,這種是我們常見(jiàn)的一種開(kāi)發(fā)方式甥角,畢竟基于SQLServer數(shù)據(jù)庫(kù)開(kāi)發(fā)起來(lái)會(huì)比較快速一些禁添。
SQL Server數(shù)據(jù)庫(kù)的管理工具是SQL Server Management Studio拆火;而Mysql數(shù)據(jù)庫(kù)的管理工具則推薦使用Navicat绣檬,這是一款非常強(qiáng)大好用的管理工具镊讼。
首先我們使用Navicat建立自己一個(gè)空白的Mysql數(shù)據(jù)庫(kù)嚼松,用來(lái)承載SQL Server 的數(shù)據(jù)導(dǎo)出需要。
例如我們創(chuàng)建一個(gè)和SQL Server數(shù)據(jù)庫(kù)同名的MVCWebMisTest數(shù)據(jù)庫(kù),并且設(shè)置它的字符集為默認(rèn)或者UTF8的編碼方式痊土,如下所示搔耕。
然后利用SQL Server Management Studio進(jìn)行數(shù)據(jù)的直接導(dǎo)出腊凶,選擇【任務(wù)】【導(dǎo)出數(shù)據(jù)】政鼠,如下所示。
然后在彈出的數(shù)據(jù)庫(kù)里面選擇導(dǎo)入的數(shù)據(jù)源和目標(biāo)胖缤,選擇導(dǎo)入的數(shù)據(jù)源界面如下所示账月。
然后在目標(biāo)里面選擇Mysql的驅(qū)動(dòng)萄喳,填入相應(yīng)的信息,如下界面所示巡莹。
然后在下一步選擇需要導(dǎo)出的表信息岩睁。
很不幸,這種方式操作數(shù)據(jù)庫(kù)的導(dǎo)出操作沒(méi)有辦法成功猛蔽。
2毁枯、從Navicat中導(dǎo)入MS SQLServer數(shù)據(jù)庫(kù)數(shù)據(jù)
既然通過(guò)SQL Server Management Studio無(wú)法導(dǎo)入數(shù)據(jù)到Mysql數(shù)據(jù)庫(kù)中,那么我們嘗試下Mysql的數(shù)據(jù)庫(kù)管理工具Navicat祭示,它也有數(shù)據(jù)傳輸(導(dǎo)入導(dǎo)出)的功能。
我們?cè)趧偛沤ê玫臄?shù)據(jù)庫(kù)上面右鍵調(diào)出對(duì)應(yīng)的【數(shù)據(jù)傳輸】功能穷躁,然后設(shè)置好數(shù)據(jù)的源和目標(biāo),如下所示谷炸。
執(zhí)行數(shù)據(jù)傳輸操作北专,順利完成,非常強(qiáng)大和方便旬陡,而且沒(méi)有任何錯(cuò)誤拓颓。如下界面所示。
檢查數(shù)據(jù)庫(kù)導(dǎo)入的數(shù)據(jù)表和數(shù)據(jù)描孟,沒(méi)有問(wèn)題驶睦。
3、Mysql數(shù)據(jù)庫(kù)之間的傳遞
那么如果我們需要部署到服務(wù)器匿醒,就需要把當(dāng)前的Mysql數(shù)據(jù)庫(kù)傳遞(或者還原)到服務(wù)器的MySQL數(shù)據(jù)庫(kù)中场航,一般來(lái)講,我們利用Mysql的Navicat管理工具就可以實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出的sql文件里面廉羔,然后在服務(wù)器里面使用反向操作即可還原數(shù)據(jù)庫(kù)成功的了溉痢。
轉(zhuǎn)儲(chǔ)SQL文件成功如下界面所示。
而在服務(wù)器的上面蜜另,我們可以利用Navicat的運(yùn)行SQL文件即可還原Mysql數(shù)據(jù)庫(kù)了适室。
運(yùn)行的結(jié)果如下所示。
當(dāng)然有時(shí)候也會(huì)發(fā)現(xiàn)存在一些表依賴(lài)引用的情況發(fā)生举瑰,不知道是不是Navicat版本出來(lái)的問(wèn)題捣辆,不過(guò)如果有這個(gè)問(wèn)題,只要不是編碼的問(wèn)題此迅,都好解決汽畴,打開(kāi)sql文件把創(chuàng)建表的順序調(diào)整一下就可以了旧巾,我就碰到過(guò)這種極端的情況,把一些依賴(lài)表調(diào)整到前面來(lái)就可以順利導(dǎo)入數(shù)據(jù)了忍些。
4鲁猩、底層的Mysql數(shù)據(jù)庫(kù)支持
底層支持多種數(shù)據(jù)庫(kù),對(duì)我們開(kāi)發(fā)不同類(lèi)型的項(xiàng)目有著非常重要的支撐作用罢坝,我們不知道客戶(hù)具體環(huán)境會(huì)選擇那種數(shù)據(jù)庫(kù)廓握,如果我們擴(kuò)展不同的數(shù)據(jù)庫(kù)非常方便和迅速,無(wú)疑會(huì)給我們提供很好的控制力和信心嘁酿。
采用了微軟企業(yè)庫(kù)Enterprise Library作為我們底層的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)模塊后隙券,對(duì)于多種數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)操作,就會(huì)統(tǒng)一采用這個(gè)企業(yè)庫(kù)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)對(duì)象闹司,操作起來(lái)非常一致娱仔,為了對(duì)不同數(shù)據(jù)庫(kù)的常規(guī)增刪改查等一些操作進(jìn)行進(jìn)一步的封裝,已達(dá)到簡(jiǎn)化代碼的目的游桩,因此我們可以為每個(gè)不同的數(shù)據(jù)庫(kù)定義一個(gè)數(shù)據(jù)訪(fǎng)問(wèn)操作基類(lèi)牲迫,以便實(shí)現(xiàn)一些不同數(shù)據(jù)庫(kù)差異性的處理,但是它們還是有一個(gè)共同的數(shù)據(jù)訪(fǎng)問(wèn)基類(lèi)借卧。
采用不同的數(shù)據(jù)庫(kù)盹憎,我們需要為不同數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)層進(jìn)行生成處理,如為SQLServer數(shù)據(jù)的表生成相關(guān)的數(shù)據(jù)訪(fǎng)問(wèn)層DALSQL谓娃,里面放置各個(gè)表對(duì)象的內(nèi)容脚乡,不過(guò)由于采用了相關(guān)的繼承類(lèi)處理和基于數(shù)據(jù)庫(kù)的代碼生成,需要調(diào)整的代碼很少滨达。
我們?yōu)榱瞬煌臄?shù)據(jù)庫(kù)準(zhǔn)備了不同的數(shù)據(jù)庫(kù)實(shí)現(xiàn)奶稠,不過(guò)也僅僅是特殊的接口調(diào)用而已,一般常規(guī)的增刪改查以及分頁(yè)等普通接口捡遍,全部交由基類(lèi)接口實(shí)現(xiàn)即可锌订。
如對(duì)于權(quán)限管理系統(tǒng)這個(gè)常規(guī)框架基礎(chǔ)模塊,多數(shù)據(jù)庫(kù)的支持就非常必要的画株,它的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)層如下所示辆飘。
不同的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)層實(shí)現(xiàn)也是相差無(wú)幾的,一般可以利用代碼生成工具進(jìn)行快速生成后谓传,增加自定義接口實(shí)現(xiàn)即可蜈项。
而對(duì)于不同數(shù)據(jù)庫(kù)的支持,直接復(fù)制過(guò)去续挟,改動(dòng)一下數(shù)據(jù)庫(kù)實(shí)現(xiàn)層的命名空間和訪(fǎng)問(wèn)層的基類(lèi)就可以了紧卒,如果有自定義SQL腳本上的差異,可以適當(dāng)?shù)男薷募纯墒觥R话銖囊环N數(shù)據(jù)庫(kù)支持?jǐn)U展到另外一種數(shù)據(jù)庫(kù)支持跑芳,無(wú)非就是復(fù)制過(guò)去轴总,進(jìn)行調(diào)整一下即可,非常方便快速博个,這個(gè)就是整體框架支持的魅力和效率所在怀樟。
這樣整合多種數(shù)據(jù)庫(kù)支持的底層后,整個(gè)數(shù)據(jù)訪(fǎng)問(wèn)的架構(gòu)設(shè)計(jì)如下所示盆佣。
有了這些底層支持往堡,我們?cè)谂渲梦募x擇不同的數(shù)據(jù)庫(kù)的時(shí)候,選擇性的保留其中一種數(shù)據(jù)庫(kù)配置信息即可共耍。下面是各種數(shù)據(jù)庫(kù)支持的配置信息參考投蝉,一般保留一種即可。