用T4模版生成对应数据库表的实体类
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#
ModelManager manager = new ModelManager();
string tableName = "tbOptAuthor";
DataTable table= manager.GetTableSchema(tableName);
#>
/* ****************************************************************************************
* 版权所有:西安xxx软件有限公司
* 用 途:数据传输对象(DTO)
* 结构组成:
* 作 者:xxx
* 创建日期:<#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#>
* 历史记录:
* ****************************************************************************************
* 修改人员:
* 修改日期:
* 修改说明:
* ****************************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace wgx.Model
{
[Serializable]
/// <summary>
/// <#= tableName.Replace("tb","DTO_") #>
/// </summary>
public class <#= tableName.Replace("tb","DTO_") #>
{
#region 属性
<#
foreach(DataRow row in table.Rows)
{
#>
/// <summary>
/// <#=row["Description"]#>
/// </summary>
public <#= manager.TransFromSqlType(row["DataType"].ToString(),row["IsNullable"].ToString())#> <#=row["ColumnName"]#>{ get; set; }
<#}
#>
#endregion
}
} <#+
public class ModelManager
{
/// <summary>
/// 数据库连接字符串
/// </summary>
private const string CONNECTION_STRING="Data Source=.;Initial Catalog=dbserver;User ID=sa;pwd=000000";
/// <summary>
/// 用户信息表名
/// </summary>
private const string PERSONINFO_TABLE_NAME = "tbOptAuthor";
/// <summary>
/// 根据表名查询表结构信息
/// SQL Server 2005写法
/// </summary>
private const string SELECT_SCHEMA_BY_TABLE_NAMEs = @"SELECT
d.name AS TableName,
a.colorder AS ColumnID,
a.name AS ColumnName,
b.name AS DataType,
g.[value] AS Description,
CASE WHEN a.isnullable = 0 THEN 'false'
ELSE 'true'
END AS IsNullable
FROM syscolumns a left join systypes b
on a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join sys.extended_properties g
on a.id=g.major_id AND a.colid = g.minor_id
WHERE d.[name] ='{0}'
order by a.id,a.colorder"; /// <summary>
/// 根据表名查询表结构信息
/// SQL Server 2000写法
/// </summary>
private const string SELECT_SCHEMA_BY_TABLE_NAME = @"SELECT (
case when a.colorder=1 then d.name else '' end) N'表名',
a.colorder N'字段序号',a.name N'ColumnName',
(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) N'标识',
(case when (SELECT count(*) FROM sysobjects
WHERE (name in (SELECT name FROM sysindexes
WHERE (id = a.id) AND (indid in
(SELECT indid FROM sysindexkeys
WHERE (id = a.id) AND (colid in
(SELECT colid FROM syscolumns
WHERE (id = a.id) AND (name = a.name))))))) AND
(xtype = 'PK'))>0 then '√' else '' end) N'主键',b.name N'DataType',a.length N'占用字节数',
COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度',isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数',
(case when a.isnullable=1 then '√'else '' end) N'IsNullable',
isnull(e.text,'') N'默认值',isnull(g.[value],'') AS N'Description'
--into ##tx
FROM syscolumns a left join systypes b on a.xtype=b.xusertype
inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join syscomments e on a.cdefault=e.id
left join sysproperties g on a.id=g.id AND a.colid = g.smallid
where d.name='{0}'
order by object_name(a.id),a.colorder"; /// <summary>
/// 获得数据连接
/// </summary>
/// <returns></returns>
private SqlConnection GetConnection()
{
return new SqlConnection(CONNECTION_STRING);
}
/// <summary>
/// 释放连接
/// </summary>
/// <param name="con"></param>
private void ReleaseConnection(SqlConnection con)
{
if (con != null)
{
if (con.State == ConnectionState.Open)
{
con.Close();
}
}
} /// <summary>
///
/// </summary>
/// <param name="tableName"></param>
public DataTable GetTableSchema(string tableName)
{
DataTable dt;
using (SqlConnection con = GetConnection())
{
con.Open(); SqlCommand cmd = con.CreateCommand();
cmd.CommandText = string.Format(SELECT_SCHEMA_BY_TABLE_NAME,tableName);
cmd.CommandType = CommandType.Text; SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);
dt = ds.Tables[];
} return dt;
}
/// <summary>
///
/// </summary>
public void Generate()
{
DataTable table = GetTableSchema(PERSONINFO_TABLE_NAME); if (table != null && table.Rows.Count > )
{
foreach (DataRow row in table.Rows)
{
Console.WriteLine("public class {0}", row["TableName"]);
Console.WriteLine("public {0} {1}", TransFromSqlType(row["DataType"].ToString(),row["IsNullable"].ToString()), row["ColumnName"]);
}
}
}
/// <summary>
/// SQL
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public string TransFromSqlType(string type,string isNull)
{
string typeStr="";
switch (type) //数据库的数据类型转换为对应的C#的数据类型,不是很完整
{
case "datetime":
case "smalldatetime":
typeStr=isNull=="true"? "?":"";
return "DateTime"+typeStr;
break;
case "int":
case "smallint":
typeStr=isNull=="true"? "?":"";
return "int"+typeStr;
break;
case "bit":
typeStr=isNull=="true"? "?":"";
return "bool"+typeStr;
break;
case "float":
typeStr=isNull=="true"? "?":"";
return "double"+typeStr;
break;
case "decimal":
case "money":
case "smallmoney":
case "numeric":
typeStr=isNull=="true"? "?":"";
return "decimal"+typeStr;
break;
case "uniqueidentifier":
typeStr=isNull=="true"? "?":"";
return "Guid"+typeStr;
break;
default:
return "string"+typeStr;
break;
}
}
}
#>
生成后的实体:
/* ****************************************************************************************
* 版权所有:西安xxx软件有限公司
* 用 途:数据传输对象(DTO)
* 结构组成:
* 作 者:xxx
* 创建日期:2012-12-28 11:32:47
* 历史记录:
* ****************************************************************************************
* 修改人员:wgx
* 修改日期:2014-12-28 11:32:47
* 修改说明:新增一个针对sql 2000数据库的查询方法
* ****************************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace wgx.Model
{
[Serializable]
/// <summary>
/// DTO_OptAuthor
/// </summary>
public class DTO_OptAuthor
{
#region 属性
/// <summary>
/// 用户组代码
/// </summary>
public string strGroupCode{ get; set; }
/// <summary>
/// 功能模块代码
/// </summary>
public string strCaseCode{ get; set; }
/// <summary>
/// 权限级别
/// </summary>
public string strLevel{ get; set; }
/// <summary>
/// 组数据级别
/// </summary>
public string strGroupLevel{ get; set; }
#endregion
}
}
使用过程可能遇到的问题:

解决办法:
用T4模版生成对应数据库表的实体类的更多相关文章
- Excel生成Oracle数据库表sql工具类
1.解决问题: 开发文档中字段比较多的时候,建表sql(Oracle下划线命名规范)比较麻烦,容易出错~~ (主要是懒) 特意手写一个工具,根据excel字段,生成建表的sql语句. ~~~末尾附Gi ...
- IDEA快速生成数据库表的实体类
IDEA连接数据库 IDEA右边侧栏有个DataSource,可以通过这个来连接数据库,我们先成功连接数据库 点击进入后填写数据库进行连接,注意记得一定要去Test Connection 确保正常连接 ...
- JPA中建立数据库表和实体间映射小结
在JPA中,映射数据库表和实体的时候,需要注意一些细节如下, 实体类要用@Entity的注解: 要用 @Id 来注解一个主键: 如果跟数据库相关联,要用@Table注解相关数据库表: 实体类中字段需要 ...
- T4模版生成多个实体文件时,提示找不到 Host
T4模版生成多个实体文件时,提示找不到 Host 使用以下方法,把hostspecific改为true就可以了 hostspecific:有效值true.false,默认为false.如果将此特性的值 ...
- EF 控制code-first生成的数据库表名的单复数
原地址:https://blog.csdn.net/winnyrain/article/details/51248410 在Code-First中,默认生成的数据库表的名称为类型的复数形式,如Mode ...
- JAVA 自动生成对应数据库表的JPA代码工具
http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成 自动生成对应数据库表的 ...
- CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板
C#生成sql视图的实体类 using System;using System.Text;using CodeSmith.Engine;using SchemaExplorer;using Syste ...
- 生成 hibernate 映射文件和实体类
创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤 创建数据库,创建 ...
- EF自动创建数据库步骤之一(实体类写法)
文章演示使用EF自动创建数据库第一个步骤创建实体类. 一.创建表映射实体类 using System; using System.Collections.Generic; using System.C ...
随机推荐
- MVC中定时发布二维码邮件
发布邮件 查看第一个方法就可以了,第二个跟这个无关 using System; using System.Collections.Generic; using System.Linq; using S ...
- HDU 6342 Expression in Memories(模拟)多校题解
题意:给你一个规则,问你写的对不对. 思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字.我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想. 下面的讲解问号只改为+ ...
- G_M_C_美食节
美食节 题解:学习了动态加边,可以说是进一步理解了网络流.具体思路就是考虑每一道菜,如果这是该位厨师最后一次做,那么等待时间就是做这道菜的时间,如果是倒数第二次做,就要两倍时间(目前做了一次,后面还有 ...
- POJ 2528 Mayor's posters(线段树染色问题+离散化)
http://poj.org/problem?id=2528 题意: 给出一面无限长的墙,现在往墙上依次贴海报,问最后还能看见多少张海报. 题意:这道题目就相当于对x轴染色,然后计算出最后还能看见多少 ...
- 利用Html.css OPPO手机导航菜单的制作解析
<body> <div id="top" class="auto"> <div class="nav"> ...
- [转]vim 退格键(backspace)不能用
http://my.oschina.net/zhangdapeng89/blog/56593 1.去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 set nocompatible ...
- 修复Ubuntu下XTerm不能正常显示中文字体的问题
打开/etc/X11/app-defaults/XTerm在最后添加如下代码: Xft.dpi:96 xpdf.title: PDF XTerm*faceSize: 1 ...
- 1、lambda表达式
lambda表达式中的类型是通过上下文推断出来的,类似String[] strArr = {"as","sd"};右边元素的子类型. 匿名内部类的情况:需要引用 ...
- L202
Yuan Cao’s teenage years were hardly typical. By age 18, he had already graduated from high school, ...
- PCB 中过孔和通孔焊盘的区别
在PCB设计中,过孔VIA和焊盘PAD都可以实现相似的功能.它们都能插入元件管脚,特别是对于直插DIP)封装的的器件来说,几乎是一样的. 但是!在PCB制造中,它们的处理方法是不一样的. 1.VIA的 ...