一个简易的从数据表生成实体的代码生成器

磨刀不误砍柴工。有些代码 写起来没有什么技术含量,而且重复费时,又有一定的规律性,对于这样的代码就想要把他们自动生成,提高生产效率。

从数据表生成实体的代码生成器就是这样一个可以提高编码效率的工具。网上一搜索就发现有不少这样的工具,而且非常不错,给码农节省很多宝贵时间。

一、原理

我也做一个这样的工具来玩玩。实现的原理很简单,数据库的系统数据库保存管理着用户建立的表、视图、字段等等的元数据,然后通过这些元数据使用SQL查询的方式,生成数据库表对应的实体对象程序代码。

二、数据库表定义

时间关系,不做太多解说,直接列出如下代码,这里假设数据库中建立一个表名为PROJECT_INFO的数据表。

表的字段:RECORD_ID,PROJECT_ID,PROJECT_NAME,USER_TYPE,USER_ID

三、生成实体代码的代码

sql代码基于sql server2016以上。

1)关键代码。这段代码可以写成一个存储过程,传入一个表名作为参数。

select
'/*/// <summary>' + cast(isnull(ep.value,'') as nvarchar(100)) + '</summary>*/' + CHAR('13')
+ ' public '
+ (case
when st.name= 'bigint' then 'long'
when st.name= 'datetime' or st.name= 'datetime2' then 'DateTime'
when st.name= 'decimal' or st.name= 'numeric' or st.name= 'float' then 'decimal'
when st.name= 'int' then 'int'
when st.name= 'nvarchar' or st.name= 'varchar' or st.name= 'nchar' or st.name= 'char' then 'string'
when st.name= 'tinyint' then 'int'
when st.name= 'binary' or st.name= 'varbinary' then 'byte []'
else 'string'
end)
+ ' ' + dbo.FUN_ToCamelName(c.name) + ' {get;set;}'
from sys.all_columns c
left join sys.extended_properties ep on c.object_id = ep.major_id and c.column_id = ep.minor_id
left join sys.systypes st on st.xusertype = c.user_type_id
where c.object_id = object_id(N'PROJECT_INFO')

2)转换带下划线的字段命名为驼峰命名

CREATE function [dbo].[FUN_ToCamelName](
@expression varchar(200)
)
RETURNS varchar(200)
as
begin
    set @expression = LOWER(@expression);
    declare @passcalName varchar(200)
    set @passcalName = ''
    select @passcalName = @passcalName + Stuff(v.value,1,1,upper(substring(v.value,1,1))) from string_split(@expression,'_') as v
    return @passcalName
end

四、效果

C#代码:

/// <summary>记录ID</summary>

public long RecordId {get;set;}
/// <summary>项目ID</summary>

public int ProjectId {get;set;}
/// <summary>项目名称</summary>

public string ProjectName {get;set;}
/// <summary>用户类型</summary>

public int UserType {get;set;}
/// <summary>用户ID</summary>

public int UserId {get;set;}

五、不足与改进

这是一个简易的半自动的代码生成工具。

可以根据需要在每个实体字段属性上加入一些特性签名,比如,[DataMember(IsRequire=false)],[StringLength(50)]等等。

private void btnCreateEntity_Click(object sender, EventArgs e) { HeaderOfEntity HeaderOfEntity = new HeaderOfEntity(); DataTable dt = new DataTable(); #region 实例化一个实体,并为这个实体类赋值 //实体类名不能为空 if (txtClassName.Text == "") { MessageBox.Show("类名不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else { HeaderOfEntity.ClassName = txtClassName.Text.Trim(); } //实体类的说明 if (txtClassExplain.Text != "") { HeaderOfEntity.ClassExplain = txtClassExplain.Text.Trim(); } else { HeaderOfEntity.ClassExplain = ""; } //实体类的作者 if (txtAuthor.Text != "") { HeaderOfEntity.ClassAuthor = txtAuthor.Text.Trim(); } else { HeaderOfEntity.ClassAuthor = ""; } //类的命名空间 if (txtNamespace.Text != "") { HeaderOfEntity.NameSpace = txtNamespace.Text.Trim(); } else { HeaderOfEntity.NameSpace = ""; } #endregion #region 将dataGridView中的数据复制出来,复制到DataTable中,做为参数 //添加列 for (int i = 0; i < dgvAttribute.Columns.Count; i++) { dt.Columns.Add(dgvAttribute.Columns[i].Name); } //添加行 for (int j = 0; j < dgvAttribute.Rows.Count; j++) { DataRow dr = dt.NewRow(); for (int k = 0; k < dgvAttribute.Columns.Count; k++) { dr[k] = dgvAttribute.Rows[j].Cells[k].Value; } dt.Rows.Add(dr); } #endregion string strFileName = "\\" + txtClassName.Text + ".cs"; //实例化一个接口对象 IWriteEntity writeEntity = new WriteEntity(); string strPath = "../../CreateClass"; FileStream fs; if (!File.Exists(strPath + strFileName)) { fs = new FileStream(strPath + strFileName, FileMode.Create,FileAccess.Write); } else { fs = new FileStream(strPath + strFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } if (writeEntity.Write(fs, dt, HeaderOfEntity) == true) { MessageBox.Show("写入文件成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("写入文件失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值