基于CYQ.Data 開發(fā)的,一款支持從一種數(shù)據(jù)庫中反向工程生成多種數(shù)據(jù)庫腳本和多數(shù)據(jù)庫間批量互導數(shù)據(jù)功能的小工具。
功能1:反向工程,從任意一種數(shù)據(jù)庫生成另外一種數(shù)據(jù)庫腳本
功能2:導數(shù)據(jù)功能:從任意一種數(shù)據(jù)庫導數(shù)據(jù)到另外一種數(shù)據(jù)庫
功能3:生成數(shù)據(jù)庫設(shè)計文檔,從任意一種數(shù)據(jù)庫生成任意的數(shù)據(jù)庫類型數(shù)據(jù)庫文檔
更新日志:
V1.0 版本
[內(nèi)含Sqlite(x86,64位操作系統(tǒng)下運行請自行下載)和MySql兩個dll]
使用介紹:CYQ.DBImport 數(shù)據(jù)庫反向工程及批量導數(shù)據(jù)庫工具
V2.0 版本[增加自定義條件、SQL視圖、導出數(shù)據(jù)庫腳本、導出數(shù)據(jù)庫設(shè)計文檔等功能]
V3.3中文版[采用CYQ.Data V5引擎,更新時間(2014-06-02)]
(PS:工具已支持網(wǎng)友反映的Oracle的ODP.NET組件)
DBImport V3.3版本更新的內(nèi)容如下:
1:增加MSSQL、MySql、Oracle間的數(shù)據(jù)互導時,同時轉(zhuǎn)換相關(guān)的字段說明。
PS:導數(shù)據(jù)的時候,把說明也帶過去,如果你想復制公司的一個數(shù)據(jù)庫,又沒有導入導出備份等權(quán)限時,用這工具導就O了。
2:數(shù)據(jù)庫腳本導出增加字段說明腳本。
PS:有了1,2也順理出來了。
3:增加小數(shù)位的處理,各數(shù)據(jù)間互導時不會出現(xiàn)精度丟失。
PS:之前的版本在小數(shù)位上,如果需要精準導過去,需要手工處理下生成的表結(jié)構(gòu),改好小數(shù)再導,這次直接做足這方面的事了。
4:數(shù)據(jù)庫文檔導出增加小數(shù)位字段顯示。
PS:有了3,4也順理出來了。
5:增加N種數(shù)據(jù)類型的處理,這些數(shù)據(jù)類型可能不見常。
PS:這個說的比較泛,是因為把MSSQL的所有類型都給處理了,底層代碼也改了不少,所以東西太多就用更泛的詞來解釋了。
6:配置項增加是否使用存儲過程分頁設(shè)置。
PS:由于底層CYQ.Data框架去掉Oracle的分頁存儲過程,對于MSSQL的分布存儲過程也增加了配置項可不啟用,所以軟件上也多了這么個配置項。
7:配置項增加以下操作項:
A:批量插入【包含主鍵】
B:批量插入【忽略主鍵】
C:批量更新【根據(jù)主鍵自動識別】
D:插入或更新【根據(jù)主鍵自動識別】
PS:這個功能很強大,通過D選項,幾乎可以實現(xiàn)兩個數(shù)據(jù)庫間的數(shù)據(jù)同步,而且重復導N次也不怕不怕了。
新版上圖:
分享本次版本更新遇到的問題:
1:MSSQL:
A:timestamp 類型,存儲的是二進制數(shù)據(jù),其它數(shù)據(jù)庫類型是日期,需要特殊處理。
B:識別各數(shù)據(jù)庫版本號,可以通過Connection對象的ServerVersion屬性獲取,以前竟然沒在意這個字段。
C:使用SqlBulkCopy批量插入,要注意數(shù)據(jù)長度問題,如果長度被截斷,會引發(fā)MSSQL服務直接掛掉,很變態(tài)的結(jié)果。
D:numeric 類型木有對應的SqlDbType。
E:當where in id(1,2,3,4,...) 表達式直接上1萬時,MSSQL2000直接就超時掛了,其它版本數(shù)據(jù)庫正常。
F:MSSQL2000 木有Xml字段,同樣也木有max相關(guān)的東西,都需要轉(zhuǎn)換其它類型處理。
G:向MSSQL數(shù)據(jù)庫里插二進制數(shù)據(jù),可以這么整:
UPDATE AllType SET
b5=newid(),
-- b7='<aa>dddd</aa>'
a1=(SELECT * FROM OPENROWSET(BULK N'C:\Users\cyq\Pictures\ico\taobao.ico', SINGLE_BLOB) AS aa)
WHERE id=1
2:SQLite:
A:如果字段為自增,那么這個字段必須為主鍵,而且只能存在這一個主鍵。
B:如果為自增加,數(shù)據(jù)庫腳本關(guān)鍵字字義必須提前,不能后面定義,如:
正解的:
"ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
錯誤的:
"ID" INTEGER AUTOINCREMENT NOT NULL,
PRIMARY KEY ("ID")
C:對于GUID類型的字段,由于存儲結(jié)構(gòu)為16進制,所以查詢比較麻煩,需要進行以下的轉(zhuǎn)換后,才能進行比較查詢:
string gv=BitConverter.ToString(new Guid(“509e4e37-43ed-4e3d-b3bc-1c0929f0d151”).ToByteArray()).Replace("-", "");
最后的 條件就變成where id=x'gv這串東西'
3:Access:
A:對于GUID,正常是where id='509e4e37-43ed-4e3d-b3bc-1c0929f0d151',但是這種條件只有在查詢和刪除時是正常的,更新的時候,還得這么寫:
where id='{509e4e37-43ed-4e3d-b3bc-1c0929f0d151}' 所以有事沒事都自己補加個括號吧。
4:MySql:
A:對于Text或Blob字段,不能設(shè)置為主鍵。
B:對于TinyInt字段,想用0-255,應該定義成:TinyInt(3) UNSIGNED
C:只能存在一個自增列,若存在,必須定義為主鍵。
D:(中文內(nèi)容或注釋)亂碼問題還是去配置MySql安裝目錄下my.ini的編碼。
5:Oracle:
A:對于設(shè)置為Not Null 屬性的字段,不允許插入空值,解決的方法是插入一個空的字符串。
B:ORA-08002: 序列 SEQ1.CURRVAL 尚未在此會話中定義,這個問題需要先調(diào)用SEQ1.nextval。
C:對于where id in(1,2,3,4,5...) 最大表達式為1000,超過這個數(shù),需要分拆成where id in(1,2,..1000) or id in(1001,1002...2000)...
D:批量執(zhí)行多條語句時,一般可以用:
begin
語句1;
語句2;
語句3;
end;
但是也有用不了的時候,比如語句是comment on column 表.字段 is 說明。解決的方法是分折成一條一條執(zhí)行了。