zoukankan      html  css  js  c++  java
  • 工具 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:oracleora112instantclientoci.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.


    转载请标明出处

    作者:AaXuan

    地址:http://www.cnblogs.com/Aaxuan

    知识共享许可协议

    本作品采用  知识共享署名 3.0 未本地化版本许可协议  进行许可。

  • 相关阅读:
    hdu 2137
    hdu 2059
    hdu 2175
    hdu 1297
    hdu 1702
    hdu 1212
    hdu 1397
    [转]常见的碱性食品有哪些?
    [转]C#反射
    每个人都有自己的未来
  • 原文地址:https://www.cnblogs.com/Aaxuan/p/8617816.html
Copyright © 2011-2022 走看看