软件官网: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. 天梯赛 L2-011. (二叉树) 玩转二叉树

    题目链接 题目描述 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格 ...

  2. CF264B Good Sequences

    传送门 Description: 松鼠丽丝特别喜欢n个她称之为“好整数”的整数:a1,a2,……,an.(会输入) 现在,她对“好序列”很感兴趣.如果一个序列x1,x2,...,xk能够满足一下三个条 ...

  3. Android笔记之广播

    为了容易理解,可以将广播代入到事件模型中,发送广播消息看做是触发event,BroadcastReceiver是处理事件的回调逻辑. 广播这种模型中涉及到两个角色,就是广播的发送者和接收者,所以会涉及 ...

  4. Halcon编程-基于形状特征的模板匹配

    halcon软件最高效的一个方面在于模板匹配,号称可以快速进行柔性模板匹配,能够非常方便的用于缺陷检测.目标定位.下面以一个简单的例子说明基于形状特征的模板匹配.      为了在右图中,定位图中的三 ...

  5. Hibernate5笔记8--Hibernate事务相关内容

    Hibernate事务相关内容: (1) 事务四大特性(简称ACID): (1)原子性(Atomicity) 事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行. (2)一致性(Con ...

  6. jenkins 和 git 的每日构建

    没有太难的技术含量,只要按照步骤操作就可以成功 step 1:全局工具配置git.exe 首先,登录 Jenkins ,在首页找到 “系统管理 -> Global Tool Configurat ...

  7. springquartz的LocalDataSourceJobStore

    spring 为quartz 提供了一个 继承 JobStoreCMT的 LocalDataSourceJobStore,主要是为了和spring更好的集成. public class LocalDa ...

  8. spring单元测试的基本配置

    @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:trade.ap ...

  9. 题解-python-CodeForces 1A

    A. Theatre Square time limit per test 2 seconds memory limit per test 64 megabytes input standard in ...

  10. Struts 2 - Environment Setup

    Our first task is to get a minimal Struts 2 application running. This chapter will guide you on how ...