由于最近公司在用webform开发ERP,用到大量重复机械的代码,之前写了篇文章,懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法,但是有人觉得这种方法很麻烦。其实我感觉确实是有点麻烦,麻烦在于字符串的拼接。
      这种时候我想到了T4模板,用过EF的 DatabaseFirst自动生成实体的同学就明白,dbfirst 自带T4模板,之前我们在学习spring.net框架的时候,也有用过T4模板根据数映射到实体类自动创建仓储。T4模板其实还有很多应用的场景。
       T4模板确实挺方便的,但是其实其中用过的原理和我之前做winform小工具差不多。都是根据数据字段和类型的映射生成实体。另外就是ado.net基础知识。
但是这种方法你得了解T4模板的基础语法。各有利弊,但是其实语法也不是很难.

先预览下扩展的界面,winform程序就不在乎美观不美观了...

      现在添加了安装包,直接点击下一步就可以了,在桌面生成快捷方式,点击可用。

一、下面我就用最简单的方式用T4模板创建Model.

 <#@ template language="C#" debug="True" hostspecific="True" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Data" #>
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Data;
using CMS.Utilities;
using System.Data.OleDb;
using System.Configuration;
using System.Data.SqlClient;
using System;
namespace MyProject.Entities
{
<#
string connectionString = "server=.;database=databasename;uid=uid;pwd=123456";
string selectQuery = "select * from Team_";
string tableName="Team_";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
System.Data.DataTable schema = null;
SqlCommand selectcommand = new SqlCommand(selectQuery, conn);
SqlDataAdapter sda = new SqlDataAdapter(selectcommand);
System.Data.DataSet dss = new System.Data.DataSet();
sda.Fill(dss);
schema=dss.Tables[];
System.Data.DataTable dt = dss.Tables[];
System.Data.DataRow dr = dss.Tables[].Rows[];
SqlCommand command = new SqlCommand(selectQuery,conn);
SqlDataAdapter ad = new SqlDataAdapter(command); #>
public class <#= tableName#>Biz
{
public class <#= tableName#>Model
{
<# foreach (DataColumn dc in dss.Tables[].Columns)
{ #>
private <#= dc.DataType.Name #> _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #>;
public <#= dc.DataType.Name #> <#= dc.ColumnName #>
{
get { return _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #>; }
set { _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #> = value; }
}
<# } #> } } }

这种方式是挺简单的。<#@ import namespace="System.Data" #>这段代码是引用命名空间,在你后台代码中用,也就是包括下面ado.net中需要引用的命名空间,基本都写在这里。用 <#...dosomething...#>这段就是不用展示出来的代码,其他的代码就是在你用T4模板生成的时候要用的代码。是不是很简单。上面的代码无需详细解释了吧,运用ado.net链接数据库,获取表字段和类型。Ctrl+S就自动生成了实体类。

根据模板生成的Model

 using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Data;
using CMS.Utilities;
using System.Data.OleDb;
using System.Configuration;
using System.Data.SqlClient;
using System;
namespace MyProject.Entities
{ public class Team_Biz
{
public class Team_Model
{ private String _team_code;
public String Team_code
{
get { return _team_code; }
set { _team_code = value; }
} private String _team_name;
public String Team_name
{
get { return _team_name; }
set { _team_name = value; }
} private String _team_status;
public String Team_status
{
get { return _team_status; }
set { _team_status = value; }
} private String _team_user;
public String Team_user
{
get { return _team_user; }
set { _team_user = value; }
} private DateTime _team_date;
public DateTime Team_date
{
get { return _team_date; }
set { _team_date = value; }
}
} } }

二、T4数据库所有表生成所有实体。大同小异,注意细节。

 <#@ template language="C#" debug="True" hostspecific="True" #>

 <#@ assembly name="System.Data" #> 

 <#@ assembly name="System.xml" #>

 <#@ import namespace="System.Collections.Generic" #>

 <#@ import namespace="System.Data.SqlClient" #>

 <#@ import namespace="System.Data" #>

 <#@ output extension=".cs" #>

  using System;

 namespace Test.T4

 {     

       <#

            string connectionString="data source=(local);initial catalog=musicstore;user id=sa;password=123456;";

            SqlConnection conn = new SqlConnection(connectionString);

            conn.Open();

            DataTable schema = conn.GetSchema("TABLES");

            string strSql = "select * from @tableName";

            SqlCommand command = new SqlCommand(strSql,conn);

            SqlDataAdapter ad = new SqlDataAdapter(command);

            DataSet ds = new DataSet();        

            foreach(DataRow row in schema.Rows)

            {  #>  

            public class <#= row["TABLE_NAME"].ToString().Trim() #>                   

            {    <#                     

                    ds.Tables.Clear();

                   command.CommandText = strSql.Replace("@tableName",row["TABLE_NAME"].ToString());

                   ad.FillSchema(ds, SchemaType.Mapped, row["TABLE_NAME"].ToString());         

                   foreach (DataColumn dc in ds.Tables[].Columns)

                   {    #>
public <#= dc.DataType.Name #> <#= dc.ColumnName #> { get; set; }
<# } #>
} <# } #>
<# conn.Close(); #>
}

DataTable schema = conn.GetSchema("TABLES");是获取数据库所有表名,然后遍历所有表名遍历表字段和类型,根据这些表生成实体。
另外还有一种方法是用数据存储过程自动生成实体。这种方法就需要SQL的基础知识了。

三、存储过程生成表实体

 SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
GO CREATE PROC [dbo].[p_db_wsp]
@dbname VARCHAR() , --数据库名
@path VARCHAR() , --实体类所在目录名,如D:/My/Models
@namespace VARCHAR() --实体类命名空间,默认值为Models
AS --判断数据库是否存在
IF ( DB_ID(@dbname) IS NOT NULL )
BEGIN
IF ( ISNULL(@namespace, '') = '' )
SET @namespace = 'Models';
-- 允许配置高级选项
EXEC sp_configure 'show advanced options', ;
-- 重新配置
RECONFIGURE;
-- 启用Ole Automation Procedures
EXEC sp_configure 'Ole Automation Procedures', ;
-- 启用xp_cmdshell,可以向磁盘中写入文件
EXEC sp_configure 'xp_cmdshell', ;
-- 重新配置
RECONFIGURE;
DECLARE @dbsql VARCHAR() ,
@tablename VARCHAR();
SET @dbsql = 'declare wsp cursor for select name from ' + @dbname
+ '..sysobjects where xtype=''u'' and name <>''sysdiagrams''';
EXEC(@dbsql);
OPEN wsp;
FETCH wsp INTO @tablename;--使用游标循环遍历数据库中每个表
WHILE ( @@fetch_status = )
BEGIN
--根据表中字段组合实体类中的字段和属性
DECLARE @nsql NVARCHAR() ,
@sql VARCHAR();
SET @nsql = 'select @s=isnull(@s+char(9)+''private '',''using System;'
+ CHAR() + 'using System.Collections.Generic;'
+ CHAR() + 'using System.Text;' + CHAR()
+ 'namespace ' + @namespace + CHAR() + '{' + CHAR()
+ CHAR() + 'public class ' + @tablename + CHAR()
+ '{''+char(13)+char(9)+''private '')+
case when a.name in(''image'',''uniqueidentifier'',''ntext'',''varchar'',''ntext'',''nchar'',''nvarchar'',''text'',''char'') then ''string''
when a.name in(''tinyint'',''smallint'',''int'',''bigint'') then ''int''
when a.name in(''datetime'',''smalldatetime'') then ''DateTime''
when a.name in(''float'',''decimal'',''numeric'',''money'',''real'',''smallmoney'') then ''decimal''
when a.name =''bit'' then ''bool''
else a.name end+'' ''+lower(''_''+b.name)+'';''+char()+char()+''public ''+
case when a.name in(''image'',''uniqueidentifier'',''ntext'',''varchar'',''ntext'',''nchar'',''nvarchar'',''text'',''char'') then ''string''
when a.name in(''tinyint'',''smallint'',''int'') then ''int''
when a.name=''bigint'' then ''long''
when a.name in(''datetime'',''smalldatetime'') then ''DateTime''
when a.name in(''float'',''decimal'',''numeric'',''money'',''real'',''smallmoney'') then ''decimal''
when a.name =''bit'' then ''bool''
else a.name end
+'' ''+b.name+char()+char()+''{''+char()+char()+char()+''get{return ''+lower(''_''+b.name)+'';}''+
char()+char()+char()+''set{''+lower(''_''+b.name)+''=value;}''+char()+char()+''}''+char()
from ' + @dbname + '..syscolumns b,
(select distinct name,xtype from ' + @dbname + '..systypes where status=) a
where a.xtype=b.xtype and b.id=object_id(''' + @dbname + '..' + @tablename
+ ''')';
EXEC sp_executesql @nsql, N'@s varchar(8000) output',
@sql OUTPUT;
SET @sql = @sql + CHAR() + '}' + CHAR() + '}';
--print @sql
DECLARE @err INT ,
@fso INT ,
@fleExists BIT ,
@file VARCHAR();
SET @file = @path + '/' + @tablename + '.cs';
EXEC @err= sp_OACreate 'Scripting.FileSystemObject',
@fso OUTPUT;
EXEC @err= sp_OAMethod @fso, 'FileExists',
@fleExists OUTPUT, @file;
EXEC @err = sp_OADestroy @fso; IF @fleExists !=
EXEC('exec xp_cmdshell ''del '+@file+''''); --存在则删除
EXEC('exec xp_cmdshell ''echo '+@sql+' > '+@file+''''); --将文本写进文件中
SET @sql = NULL;
FETCH wsp INTO @tablename;
END;
CLOSE wsp;
DEALLOCATE wsp;
PRINT '生成成功!';
END;
ELSE
PRINT '数据库不存在!';

调用存储过程:    EXEC [dbo].[p_db_wsp] '数据库名字', '保存的路径:D:\work\新建文件夹', '生成实体类名字';

上面的方法都是生成实体的,下面就是生成insert的方法

四,T4生成insert的方法

 <#@ template language="C#" debug="True" hostspecific="True" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Data" #>
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Data;
using CMS.Utilities;
using System.Data.OleDb;
using System.Configuration;
using System.Data.SqlClient;
using System;
namespace MyProject.Entitiese
{
<#
string connectionString = "server=192.168.2.230;database=tjprj;uid=erptest;pwd=test@123456";
string selectQuery = "select * from Team_";
string tableName="Team_";
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
System.Data.DataTable schema = null;
SqlCommand selectcommand = new SqlCommand(selectQuery, conn);
SqlDataAdapter sda = new SqlDataAdapter(selectcommand);
System.Data.DataSet dss = new System.Data.DataSet();
sda.Fill(dss);
schema=dss.Tables[];
System.Data.DataTable dt = dss.Tables[];
System.Data.DataRow dr = dss.Tables[].Rows[];
SqlCommand command = new SqlCommand(selectQuery,conn);
SqlDataAdapter ad = new SqlDataAdapter(command);
#>
public class <#= tableName#>Bizs
{
public class <#= tableName#>Models
{
<# foreach (DataColumn dc in dss.Tables[].Columns)
{ #>
private <#= dc.DataType.Name #> _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #>;
public <#= dc.DataType.Name #> <#= dc.ColumnName #>
{
get { return _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #>; }
set { _<#= dc.ColumnName.Replace(dc.ColumnName[].ToString(), dc.ColumnName[].ToString().ToLower()) #> = value; }
}
<# } #> }
public bool Insert<#= tableName#>(<#= tableName#>Models model)
{
string strSql = @"
INSERT Team_(
<# foreach (DataColumn dc in dss.Tables[0].Columns)
{ #><#= dc.ColumnName #>,
<# } #>
)
VALUES (
<# foreach (DataColumn dc in dss.Tables[0].Columns)
{ #><#= dc.ColumnName #>,
<# } #>
)
";
SqlParameter[] parameters = new SqlParameter[]
{
<# foreach (DataColumn dc in dss.Tables[].Columns)
{ #> new SqlParameter("<#= dc.ColumnName #>,", SqlDbType.NVarChar, ),
<# } #>
};
<# for (int i = ; i < dr.Table.Columns.Count; i++)
{ #> parameters[<#=i#>].Value = model.<#=dr.Table.Columns[i] #>;
<# } #>
using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionString))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
try
{
int i = SqlHelper.ExecuteNonQuery(trans, CommandType.Text, strSql, parameters);
if (i > )
{
trans.Commit();
return i > ;
}
else
{
trans.Rollback();
return false;
}
}
catch (System.Exception e)
{
trans.Rollback();
return false;
throw e;
}
}
}
} } }

生成代码:

 using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Data;
using CMS.Utilities;
using System.Data.OleDb;
using System.Configuration;
using System.Data.SqlClient;
using System;
namespace MyProject.Entitiese
{ public class Team_Bizs
{
public class Team_Models
{ private String _team_code;
public String Team_code
{
get { return _team_code; }
set { _team_code = value; }
} private String _team_name;
public String Team_name
{
get { return _team_name; }
set { _team_name = value; }
} private String _team_status;
public String Team_status
{
get { return _team_status; }
set { _team_status = value; }
} private String _team_user;
public String Team_user
{
get { return _team_user; }
set { _team_user = value; }
} private DateTime _team_date;
public DateTime Team_date
{
get { return _team_date; }
set { _team_date = value; }
} }
public bool InsertTeam_(Team_Models model)
{
string strSql = @"
INSERT Team_(
Team_code,
Team_name,
Team_status,
Team_user,
Team_date, )
VALUES (
Team_code,
Team_name,
Team_status,
Team_user,
Team_date, )
";
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("Team_code,", SqlDbType.NVarChar, ),
new SqlParameter("Team_name,", SqlDbType.NVarChar, ),
new SqlParameter("Team_status,", SqlDbType.NVarChar, ),
new SqlParameter("Team_user,", SqlDbType.NVarChar, ),
new SqlParameter("Team_date,", SqlDbType.NVarChar, ), };
parameters[].Value = model.Team_code;
parameters[].Value = model.Team_name;
parameters[].Value = model.Team_status;
parameters[].Value = model.Team_user;
parameters[].Value = model.Team_date; using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionString))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
try
{
int i = SqlHelper.ExecuteNonQuery(trans, CommandType.Text, strSql, parameters);
if (i > )
{
trans.Commit();
return i > ;
}
else
{
trans.Rollback();
return false;
}
}
catch (System.Exception e)
{
trans.Rollback();
return false;
throw e;
}
}
}
} } }

方法与之前一篇文章和上面讲到生成实体的方法差不多,还有update,select,delete 方法也是差不多的,我就不再贴上代码了。

github地址:https://github.com/Jimmey-Jiang/JWorkHelper稍后推送代码上去。

懒人小工具1:自动生成Model,Insert,Select,Delete以及导出Excel的方法

懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法的更多相关文章

  1. 懒人小工具:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法

    之前写了篇文章,懒人小工具:[自动生成Model,Insert,Select,Delete以及导出Excel的方法](http://www.jianshu.com/p/d5b11589174a),但是 ...

  2. 懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法

    在开发的过程中,我们为了节约时间,往往会将大量重复机械的代码封装,考虑代码的复用性,这样我们可以节约很多时间来做别的事情.最近跳槽到一节webform开发的公司,主要是开发自己公司用的ERP.开始因为 ...

  3. 懒人小工具1:winform自动生成Model,Insert,Select,Delete以及导出Excel的方法

       懒人小工具2:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法    github地址:https://github.com/Jimmey-Jiang/J ...

  4. 使用SqlSugar 4.X的T4生成实体类

    <#@ template debug="false" hostspecific="true" language="C#" #> ...

  5. EA生成实体类代码

    引言 在做机房个人版重构的时候,就听说了EA是一个强大的软件.仅仅只是知道的时候,已经画完了图,没有怎么用EA其它的功能,所以一直没有见识过罢了.如今到了机房合作了,想到EA一定要好好用,这样能省不少 ...

  6. 通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件

    通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件   文章目录 Ja ...

  7. T4模板根据DB生成实体类

    1.前言 为什么会有这篇文章了,最近看到了一些框架,里面要写的代码太多了,故此就想偷懒,要是能写出一个T4模板,在数据库添加表后,根据模板就可以自动生成了类文件了,这样多好,心动不如行动.记得使用T4 ...

  8. 使用T4为数据库自动生成实体类

    T4 (Text Template Transformation Toolkit) 是一个基于模板的代码生成器.使用T4你可以通过写一些ASP.NET-like模板,来生成C#, T-SQL, XML ...

  9. T4模板_根据DB生成实体类

    为了减少重复劳动,可以通过T4读取数据库表结构,生成实体类,用下面的实例测试了一下 1.首先创建一个项目,并添加文本模板: 2.添加 文本模板: 3.向T4文本模板文件添加代码: <#@ tem ...

随机推荐

  1. 慕学在线网0.2_users表设计(1)

    1.Django App设计: users-用户管理(任何web中,users表都是第一个被设计的) course-课程管理 organization-机构和教师管理 operation-用户操作管理 ...

  2. 洗礼灵魂,修炼python(22)--自定义函数(3)—函数作用域,闭包

    前面你看到嵌套两层的函数,也许你有感而发,想来点刺激的对不?那么如果每层内的变量名如果相同会怎样?拿个例子看下就知道: 报错了,报错信息大意是,本地变量‘num’引用前没有被赋值定义.这咋回事,我外层 ...

  3. python第四十九天--paramiko模块安装大作战

    准备开始学习:paramiko模块,发现这个模块十分难搞 安装不上 搞了半天,win10 64下 pytyon 3.6 的 paramiko模块 死活安不上,在网上不断的找资料,可是没有用,没有用啊 ...

  4. 【第六篇】SAP ABAP7.5x新语法之SQL注入

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之SQL注入   前 ...

  5. Kubernetes的搭建与配置(一):集群环境搭建

    1.环境介绍及准备: 1.1 物理机操作系统 物理机操作系统采用Centos7.3 64位,细节如下. [root@localhost ~]# uname -a Linux localhost.loc ...

  6. 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片

    目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...

  7. Windows端部署zabbix-agent

    一.windows客户端的配置关闭windows防火墙或者开通10050和10051端口(1).关闭防火墙(不推荐直接关闭,测试可以这样做,尤其是最近勒索病毒猛烈)开始—控制面板—windows防火墙 ...

  8. February 8th, 2018 Week 6th Thursday

    When you fall in love, friends, let yourself fall. 当你坠入爱河,我的朋友,你就放手去爱吧. To love someone is like movi ...

  9. cglib之Enhancer

    1. 背景 cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用.本文针对Enhancer的用法以实际代码为例作一些介绍. 2. Enhancer是啥 Enhance ...

  10. svn 更新

    dev更新流程: 1.打开软件,文件—>打开,弹出右边对话框链接dev地址      2.在窗口输入cd /var/www/user 回车 3.输入svn up 则更新dev代码完成 本地提交到 ...