工具 EZDML表結構設計器


軟件官網:http://www.ezdml.com/

作者郵箱:huzzz@163.com

 

 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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM