软件官网: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
: Result := 'unknown';
: Result := 'string';
: Result := 'int';
: Result := 'decimal';//替换double
: Result := 'DateTime?';//可空类型
: Result := 'bool';
: Result := 'enum';
: Result := 'var';
: Result := 'object';
: Result := 'List';
: Result := 'function';
: Result := 'EventHnadler';
: Result := 'type';
else
Result := 'unknown';
end;
end; //获取属性名
function getPublicName(N: string): string;
begin
Result := N;
if (Result <> '') then
if Result[] >= 'a' then
if Result[] <= 'z' then
Result[] := Chr(Ord(Result[]) - (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;'
+ '}' + ##;
end; T := F.GetFieldComments;
if T <> '' then
begin
S :='/// <summary>' + ##
+ '///' + T + ##
+ '/// </summary>' + ##
+ S;
end; CurOut.Add(' ' + StringReplace(S, ##, ##' ', [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, ##, ##' ', [rfReplaceAll]));
end; L := ;
for I := to MetaFields.Count - 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 := to MetaFields.Count - do
begin
f := MetaFields[I];
AddFieldInfo;
end; CurOut.Add(' }');
CurOut.Add('}');
end;
end.

工具 EZDML表结构设计器的更多相关文章

  1. [转]表结构设计器EZDML介绍说明(包含修改配置文件,修改文本字段属性)

    超轻量级的表结构设计工具,这是一个数据库建表的小软件,可快速的进行数据库表结构设计,建立数据模型.类似大家常用的数据库建模工具如PowerDesigner.ERWIN.ER-Studio和Ration ...

  2. YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)

    程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...

  3. 基于Extjs的web表单设计器 第五节——数据库设计

    这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...

  4. formbuild拖拽表单设计器

        formbuild拖拽表单设计器 表单设计器适用于OA系统.问卷调查系统.考试系统等系统,具体使用请前至官网API请点击 formbuild拖拽表单设计器     formbuild迭代几个功 ...

  5. SlickMaster.NET 开源表单设计器快速使用指南

    前言:在企业数据处理过程中,经常需要通过定制表单来输入业务数据.由于涉及的数据比较离散,并不同于ERP系统的紧密关联数据.假如由开发人员每个增加页面,工作量会比较大,后期后期的维护很升级也耗费时间和精 ...

  6. 基于Extjs的web表单设计器 第二节——表单控件设计

    这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基 ...

  7. .net erp(办公oa)开发平台架构概要说明之表单设计器

    背景:搭建一个适合公司erp业务的开发平台.   架构概要图: 表单设计开发部署示例图    表单设计开发部署示例说明1)每个开发人员可以自己部署表单设计至本地一份(当然也可以共用一套开发环境,但是如 ...

  8. 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用

    基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...

  9. 基于Extjs的web表单设计器 第六节——界面框架设计

    基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...

随机推荐

  1. webSQL 增删改查

    webSQL 增删改查  转载于:https://www.cnblogs.com/liuhao-web/p/7866032.html /** *数据库操作辅助类,定义对象.数据操作方法都在这里定义 * ...

  2. VUE和ES6资源收集

    MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript https://developer.mozilla.org/en/docs/We ...

  3. 20165230 2017-2018-2 《Java程序设计》第6周学习总结

    20165230 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用使用类 String类常用方法 public int length() publ ...

  4. 九、springcloud之服务网关zuul(二)

    一.路由熔断 当我们的后端服务出现异常的时候,我们不希望将异常抛出给最外层,期望服务可以自动进行一降级.Zuul给我们提供了这样的支持.当某个服务出现异常时,直接返回我们预设的信息. 我们通过自定义的 ...

  5. RestTemplate中文乱码问题(spring-web3.0.7版本)

    从网上找的方法: 方法一: //resttemplate乱码问题 //3.1.X以上版本使用 // restTemplate.getMessageConverters().add(0, StringH ...

  6. Java 从多层嵌套中访问内部类的成员

    一个内部类被嵌套多少层并不重要--它能透明地访问所有它能嵌入的外围类的所有成员 //: innerclasses/MultiNestingAccess.java // Nested classes c ...

  7. ZCTF2015 pwn试题分析

    ZCTF的pwn赛题分析, PWN100 这道题与SCTF的pwn100玩法是一样的,区别在于这个要过前面的几个限制条件.不能触发exit(0).否则就不能实现溢出了. 依然是触发canary来lea ...

  8. hdu 5078(2014鞍山现场赛 I题)

    数据 表示每次到达某个位置的坐标和时间 计算出每对相邻点之间转移的速度(两点间距离距离/相隔时间) 输出最大值 Sample Input252 1 9//t x y3 7 25 9 06 6 37 6 ...

  9. codis+redis 集群搭建管理

    Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使 ...

  10. 【LOJ】#2057. 「TJOI / HEOI2016」游戏

    题解 我并不会做,我觉得很像网络流但是毫无建图思路 我猜了个贪心,写了一下--啥过了90分?!这数据是有多水啊.. 哦又是行列拆点 不过要按照'#'进行拆点,也就是一段横着的区间只能放一个炸弹,一段竖 ...