由于最近公司在用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. 【HANA系列】SAP HANA XS使用Data Services查询CDS实体【二】

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Dat ...

  2. What To Do When MySQL Runs Out of Memory: Troubleshooting Guide

    In this article, I will show you how to use the new version of MySQL (5.7+) and how to troubleshoot ...

  3. CRM lookup筛选

    function Loadcouse() { var type; var id; retrieveRecord(Xrm.Page.getAttribute("ownerid").g ...

  4. 安全之路 —— C/C++实现利用添加注册表项实现文件自启动

    简介 添加注册表项是实现文件自启动的经典方法之一,但因为操作注册表项是一个敏感操作,被报毒可能性较大,但即便如此,这个方法还是值得一学的,因为后期大部分编程都涉及到注册表操作. 最常使用到的注册表项有 ...

  5. Hive-1.2.1_03_DDL操作

    Hive官方文档:Home-UserDocumentation Hive DDL官方文档:LanguageManual DDL 参考文章:Hive 用户指南 注意:各个语句的版本时间,有的是在 hiv ...

  6. asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFactory,DALMsSql'.

    asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFa ...

  7. February 2nd, 2018 Week 5th Friday

    Reputation takes a life time to build and a second to destroy. 树立名声需要一生的努力,而毁掉它只需要一秒. To be a smart ...

  8. 英语初级学习系列-00-Name-介绍自己

    1. 询问名字 常用句子 1. Hi, may I have your name, please? 2. Could you please tell me your name? 3. Will it ...

  9. ABAP 面向对象事件处理

    面向对象事件在ABAP中十分重要,并且很容易处理. 我们需要handler方法来注册事件: METHODS : handle_event_raised FOR EVENT event_raised O ...

  10. [php] yii debug设置

    最近在使用yii写rest api发现在所有错误信息都写在log文件里调试不是很直接 在index.php头部查入就ok了 defined('YII_ENABLE_EXCEPTION_HANDLER' ...