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