用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 ...
随机推荐
- Docker 安装&基本操作
Docker 安装 Docker 中的三个概念:镜像,容器,仓库 镜像(image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器.Docker 提供了一个很简单的机制来 ...
- python 使用两个列表合成字典
keys = ['red', 'green', 'blue'] values = ['#FF0000','#008000', '#0000FF'] color_dictionary = dict(zi ...
- 80端口未被占用,无法启动wamp的解决方法(原创)
起床之后想要弄弄侧边栏的东西,打开wamp居然无法启动apache服务,上网查了之后才知道是需要启动httpd.exe这个程序,测试了很久,80端口也没有被占用,点击启动apache服务的时候弹出co ...
- ✅javascript 语法:附加子节点
received: function(data) { $("#notifications").prepend(data.html); } 如何用原生js写出jquery的功能: 先 ...
- node+websocket创建简易聊天室
关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...
- 使用Jenkins来实现内部的持续集成流程(上)
前言 Jenkins和TeamCity都是大杀器,用于搭建内部持续集成环境都是妥妥的.本篇主要介绍Jenkins的安装,下篇将介绍相关配置和使用. 目录 安装和配置 第一次启动 插件安装,第一次进入时 ...
- hdu 6158 The Designer( 反演圆)
The Designer Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- android中LayoutInflater.from(context).inflate的分析
在应用中自定义一个view,需要获取这个view的布局,需要用到 (LinearLayout) LayoutInflater.from(context).inflate(R.layout.conten ...
- 201621123006 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- java基础第5天
数组概述 数组是储存多个变量(元素)的东西(容器} 这多个变量的数据类型要一致 概念:数组是存储同一种数据类型多个元素的集合.也就是一个容器,这个容器有个名字,就是数组名. 数组就是在内存中开辟出一段 ...