軟體官網:http://www.ezdml.com/ 作者郵箱:[email protected] EZDML EZDML是一個資料庫建表的軟體。 可快速的進行資料庫表結構設計,建立數據模型。 類似大家常用的資料庫建模工具如 PowerDesigner、ERWIN、ER-Studio 和 Rational- ...
軟體官網:http://www.ezdml.com/
作者郵箱:[email protected]
EZDML
EZDML是一個資料庫建表的軟體。
可快速的進行資料庫表結構設計,建立數據模型。
類似大家常用的資料庫建模工具如 PowerDesigner、ERWIN、ER-Studio 和 Rational-Rose 等的超級精簡版。
該軟體是從 2006 年 4 月開發至今仍然在維護,最近在 2017 年 8 月 5 日 更新了 V2.15 版本。
作者的精神值得我們學習。
包含功能:
1. 表結構設計:創建表、欄位、主鍵、外鍵、索引和註釋;
2. 表描述:可直接編輯文字描述快速生成表結構,愛用鍵盤的人會喜歡這個功能;
3. 模型圖:自動生成模型圖;可設計和顯示物理/邏輯視圖,支持自動佈局、平移、縮小放大等操作;
4. 導入資料庫:導入資料庫中的已有對象,即所謂的逆向工程(支持ORACLE、MYSQL、SQLSERVER和ODBC);
5. 生成資料庫:可生成直接創建資料庫的SQL腳本;也可與現有資料庫比較,然後生成同步腳本的功能,不至於丟失現有數據;
6. 生成代碼:目前可生成C++、Pas、C#和Java的簡單類定義代碼;
7. 導出EXCEL。
使用說明:
模型圖中可 按加減號放大縮小,方向鍵平移,R複原,F居中;
表的描述字中,可以輸入簡寫字母代替數據類型,S,I,F,D,Y,E,B分別代表文本,整數,浮點數,時間,真假,枚舉,文件,如
測試表
--------
ID PK
RID FK
標題 S(200)
數量 I
單價 F(10,2)
日期 D
註釋 S
外鍵關係目前可以在模型圖上創建顯示,或在欄位的關聯表欄位里設置;
導入生成功能可支持ORACLE、MYSQL、SQLSERVER和ODBC資料庫;
生成功能在未連接資料庫時,生成的是創建資料庫的初始化SQL;只有連接了資料庫,才會與資料庫進行比對生成升級SQL;
為避免數據丟失,同步資料庫時不會刪除欄位,但仍然會生成註釋形式的相應SQL;
修改INI文件自定義配置(菜單:工具|修改INI配置):
[DefaultFieldTypes] ——修改預設數據類型對應的物理類型
1=String:VARSTR(2000) ——修改邏輯類型名為String的物理類型名為VARSTR,預設長度為2000
2=Integer:DECIMAL ——修改邏輯類型名為Integer的物理類型名為DECIMAL,無預設長度
[CustFieldTypes] ——添加額外的數據類型到類型下拉列表
1=BigInt
2=Decimal
3=TestUnk
[CustDataTypeReplaces] ——指定替換欄位類型
1=VARCHAR2:NVARCHAR2 ——將VARCHAR2替換為NVARCHAR2(全字匹配)
2=NUMBER(10):DECIMAL ——將NUMBER(10)替換為DECIMAL(全字匹配)
3=%TEXT%:NCLOB ——將TEXT替換為NCLOB(模糊匹配,類似SQL中的like操作)
4=%RAW:BLOB ——將RAW替換為BLOB(左邊模糊匹配,右邊精確匹配,類似SQL中的like操作)
[Options]
AutoSaveMinutes=5 ——定時每5分鐘自動保存,保存為同目錄.tmp文件(打開時自動載入tmp,想恢復載入原始文件的話要先刪除tmp),為0則不保存
FieldNameMaxDrawSize=64 ——在模型圖上允許顯示的最大欄位名長度
FieldTypeMaxDrawSize=48 ——在模型圖上允許顯示的最大欄位類型長度
CreateSeqForOracle=0 ——禁止為ORACLE表生成序列號
OCIDLL=D:\oracle\ora112\instantclient\oci.dll ——指定OCI.dll的路徑(用於instant client或裝了多個ORACLE client時)
還有一些快捷的小操作:
/ 鍵 縮放至最佳大小
在一個模型內,按表名的第一個字母的鍵,會直接打開該表的描述界面。
接下來講一下我認為能對我們日常開發有很大幫助的的功能,那就是他的腳本。
腳本語言是 pascal 語言,一個已經涼了的語言。所以不建議大家在上面花費精力。
而且該軟體的語言似乎和普通的 pascal 語言規則不太一樣,pascal是有幾種版本的,這裡我也懶得深入研究了。
下麵這個就是 C# 的實體類腳本,在軟體的預設基礎上修剪改造的。大家可以簡單理解一下,語言的語法都是相通的。
function DEF_CTMETAFIELD_DATATYPE_NAMES_CSHARP(idx: TCtFieldDataType): string; begin case Integer(idx) of 0: Result := 'unknown'; 1: Result := 'string'; 2: Result := 'int'; 3: Result := 'decimal';//替換double 4: Result := 'DateTime?';//可空類型 5: Result := 'bool'; 6: Result := 'enum'; 7: Result := 'var'; 8: Result := 'object'; 9: Result := 'List'; 10: Result := 'function'; 11: Result := 'EventHnadler'; 12: Result := 'type'; else Result := 'unknown'; end; end; //獲取屬性名 function getPublicName(N: string): string; begin Result := N; if (Result <> '') then if Result[1] >= 'a' then if Result[1] <= 'z' then Result[1] := Chr(Ord(Result[1]) - (Ord('a') - Ord('A'))); end; function GetDesName(p, n: string): string; begin if p = '' then Result := n else Result := p; end; var I, L: Integer; clsName, S, T, V, FT: string; f: TCtMetaField; //獲取欄位名 function GFieldName(Fld: TCtMetaField): string; begin Result := GetDesName(f.Name, f.DisplayName); end; //獲取欄位類型 function GFieldType(Fld: TCtMetaField): string; begin Result := DEF_CTMETAFIELD_DATATYPE_NAMES_CSHARP(f.DataType); end; //程式開始 procedure AddFieldInfo; begin S := GetDesName(f.Name, f.DisplayName); begin FT := DEF_CTMETAFIELD_DATATYPE_NAMES_CSHARP(f.DataType); S := 'public ' + FT + ' ' + getPublicName(S) + '{' + 'get;' + 'set;' + '}' + #13#10; end; T := F.GetFieldComments; if T <> '' then begin S :='/// <summary>' + #13#10 + '///' + T + #13#10 + '/// </summary>' + #13#10 + S; end; CurOut.Add(' ' + StringReplace(S, #13#10, #13#10' ', [rfReplaceAll])); end; begin with CurTable do begin S := GetTableComments; CurOut.Add(''); CurOut.Add('using System;'); CurOut.Add('using System.Text;'); CurOut.Add(''); CurOut.Add('namespace ' + Name); CurOut.Add('{'); S := GetTableComments; if S <> '' then begin S := StringReplace(S, '}', '%7D', [rfReplaceAll]); CurOut.Add(' //' + StringReplace(S, #13#10, #13#10' ', [rfReplaceAll])); end; L := 0; for I := 0 to MetaFields.Count - 1 do begin f := MetaFields[I]; S := GetDesName(f.Name, f.DisplayName); if L < Length(S) then L := Length(S); end; //表名 clsName := Name; CurOut.Add(' [NPoco.TableName("' + clsName + '")]'); CurOut.Add(' [NPoco.PrimaryKey("Id", AutoIncrement = true)]'); CurOut.Add(' public class ' + clsName); CurOut.Add(' {'); CurOut.Add(''); //構造函數 CurOut.Add(' public ' + clsName + '()'); CurOut.Add(' {'); CurOut.Add(' }'); for I := 0 to MetaFields.Count - 1 do begin f := MetaFields[I]; AddFieldInfo; end; CurOut.Add(' }'); CurOut.Add('}'); end; end.