博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
T4批量生成多文件
阅读量:6153 次
发布时间:2019-06-21

本文共 12742 字,大约阅读时间需要 42 分钟。

http://www.cnblogs.com/zengxiangzhan/p/3250105.html

Manager.ttinclude

<#@ assembly name="System.Core"#><#@ assembly name="System.Data.Linq"#><#@ assembly name="EnvDTE"#><#@ assembly name="System.Xml"#><#@ assembly name="System.Xml.Linq"#><#@ import namespace="System"#><#@ import namespace="System.CodeDom"#><#@ import namespace="System.CodeDom.Compiler"#><#@ import namespace="System.Collections.Generic"#><#@ import namespace="System.Data.Linq"#><#@ import namespace="System.Data.Linq.Mapping"#><#@ import namespace="System.IO"#><#@ import namespace="System.Linq"#><#@ import namespace="System.Reflection"#><#@ import namespace="System.Text"#><#@ import namespace="System.Xml.Linq"#><#@ import namespace="Microsoft.VisualStudio.TextTemplating"#><#+ // Manager class records the various blocks so it can split them upclass Manager {    private class Block {        public String Name;        public int Start, Length;    }     private Block currentBlock;    private List
files = new List
(); private Block footer = new Block(); private Block header = new Block(); private ITextTemplatingEngineHost host; private StringBuilder template; protected List
generatedFileNames = new List
(); public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) { return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template); } public void StartNewFile(String name) { if (name == null) throw new ArgumentNullException("name"); CurrentBlock = new Block { Name = name }; } public void StartFooter() { CurrentBlock = footer; } public void StartHeader() { CurrentBlock = header; } public void EndBlock() { if (CurrentBlock == null) return; CurrentBlock.Length = template.Length - CurrentBlock.Start; if (CurrentBlock != header && CurrentBlock != footer) files.Add(CurrentBlock); currentBlock = null; } public virtual void Process(bool split) { if (split) { EndBlock(); String headerText = template.ToString(header.Start, header.Length); String footerText = template.ToString(footer.Start, footer.Length); String outputPath = Path.GetDirectoryName(host.TemplateFile); files.Reverse(); foreach(Block block in files) { String fileName = Path.Combine(outputPath, block.Name); String content = headerText + template.ToString(block.Start, block.Length) + footerText; generatedFileNames.Add(fileName); CreateFile(fileName, content); template.Remove(block.Start, block.Length); } } } protected virtual void CreateFile(String fileName, String content) { if (IsFileContentDifferent(fileName, content)) File.WriteAllText(fileName, content); } public virtual String GetCustomToolNamespace(String fileName) { return null; } public virtual String DefaultProjectNamespace { get { return null; } } protected bool IsFileContentDifferent(String fileName, String newContent) { return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent); } private Manager(ITextTemplatingEngineHost host, StringBuilder template) { this.host = host; this.template = template; } private Block CurrentBlock { get { return currentBlock; } set { if (CurrentBlock != null) EndBlock(); if (value != null) value.Start = template.Length; currentBlock = value; } } private class VSManager: Manager { private EnvDTE.ProjectItem templateProjectItem; private EnvDTE.DTE dte; private Action
checkOutAction; private Action
> projectSyncAction; public override String DefaultProjectNamespace { get { return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString(); } } public override String GetCustomToolNamespace(string fileName) { return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString(); } public override void Process(bool split) { if (templateProjectItem.ProjectItems == null) return; base.Process(split); projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null)); } protected override void CreateFile(String fileName, String content) { if (IsFileContentDifferent(fileName, content)) { CheckoutFileIfRequired(fileName); File.WriteAllText(fileName, content); } } internal VSManager(ITextTemplatingEngineHost host, StringBuilder template) : base(host, template) { var hostServiceProvider = (IServiceProvider) host; if (hostServiceProvider == null) throw new ArgumentNullException("Could not obtain IServiceProvider"); dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); if (dte == null) throw new ArgumentNullException("Could not obtain DTE from host"); templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile); checkOutAction = (String fileName) => dte.SourceControl.CheckOutItem(fileName); projectSyncAction = (IEnumerable
keepFileNames) => ProjectSync(templateProjectItem, keepFileNames); } private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable
keepFileNames) { var keepFileNameSet = new HashSet
(keepFileNames); var projectFiles = new Dictionary
(); var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.get_FileNames(0)) + "."; foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) projectFiles.Add(projectItem.get_FileNames(0), projectItem); // Remove unused items from the project foreach(var pair in projectFiles) if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix)) pair.Value.Delete(); // Add missing files to the project foreach(String fileName in keepFileNameSet) if (!projectFiles.ContainsKey(fileName)) templateProjectItem.ProjectItems.AddFromFile(fileName); } private void CheckoutFileIfRequired(String fileName) { var sc = dte.SourceControl; if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName)) checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null)); } }} #>

 

批量生成实体类(数据库访问)

<#@ template debug="false" hostspecific="true" language="C#" #><#@ assembly name="System.Data" #><#@ assembly name="System.xml" #><#@ import namespace="System.Collections.Generic" #><#@ import namespace="System.Data.SqlClient" #><#@ import namespace="System.Data" #><#@ assembly name="System.Core" #><#@ import namespace="System.Linq" #><#@include file="$(SolutionDir)\Manager.ttinclude"#> <# var manager = Manager.Create(Host, GenerationEnvironment); #><# manager.StartHeader(); #>using System;using System.Collections.Generic;namespace My.Model{   <# manager.EndBlock(); #><#            string connectionString= "server=localhost;database=UserRight;uid=sa;pwd=123@abc;";            SqlConnection conn = new SqlConnection(connectionString);    conn.Open();        string selectQuery ="SET FMTONLY ON; select * from @tableName; SET FMTONLY OFF;";    SqlCommand command = new SqlCommand(selectQuery,conn);    SqlDataAdapter ad = new SqlDataAdapter(command);    System.Data.DataSet ds = new DataSet();     System.Data.DataTable schema = conn.GetSchema("Tables");    foreach(System.Data.DataRow row in schema.Rows)    {            ds.Tables.Clear();        string tb_name = row["TABLE_NAME"].ToString();                command.CommandText = selectQuery.Replace("@tableName",row["TABLE_NAME"].ToString());        ad.FillSchema(ds,SchemaType.Mapped,tb_name);          manager.StartNewFile(tb_name+".cs");#>    ///     /// 实体-<#=tb_name#>     ///     public partial class <#=tb_name#>        {            <#        PushIndent("          ");        foreach (DataColumn dc in ds.Tables[0].Columns)         {            WriteLine("public " + dc.DataType.Name + (dc.AllowDBNull && dc.DataType.Name.ToLower() != "string" ? "? ": " ") + dc.ColumnName + " { get; set; }");        }        PopIndent();        #>    } <#        manager.EndBlock();        }                conn.Close();  #><# manager.StartFooter(); #>}<# manager.EndBlock(); #><# manager.Process(true); #>

 

批量生成实体类(ADO实体对象模型)

<#@ template debug="false" hostspecific="true" language="C#" #><#@ assembly name="System.Data" #><#@ assembly name="System.xml" #><#@ assembly name="System.Core" #><#@ import namespace="System.Collections.Generic" #><#@ import namespace="System.Data.SqlClient" #><#@ import namespace="System.Data" #><#@ import namespace="System.Linq" #><#@ output extension=".cs" #>using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace JiaHe.Entities{  <#            string connectionString= "server=localhost;database=JiaHe;uid=sa;pwd=123@abc;";            SqlConnection conn = new SqlConnection(connectionString);    conn.Open();        System.Data.DataTable schema = conn.GetSchema("Tables");    foreach(System.Data.DataRow row in schema.Rows)    {            string tb_name= row["TABLE_NAME"].ToString();        string selectQuery =            @"            SELECT (case when a.colorder=1 then d.name else null end) 表名, a.colorder 字段序号,a.name 字段名,            (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) 标识,             (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) 主键,b.name 类型,a.length 占用字节数,              COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,              isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,(case when a.isnullable=1 then '√'else '' end) 允许空,              isnull(e.text,'') 默认值,isnull(g.[value], ' ') AS [说明]            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 sys.extended_properties g on a.id=g.major_id AND a.colid=g.minor_id            left join sys.extended_properties f on d.id=f.class and f.minor_id=0            --where b.name is not null            --WHERE d.name='TestTB' --如果只查询指定表,加上此条件            WHERE d.NAME = '" + tb_name + @"' --如果只查询指定表,加上此条件            order by a.id,a.colorder            ";        SqlCommand command = new SqlCommand(selectQuery,conn);        SqlDataAdapter ad = new SqlDataAdapter(command);        System.Data.DataSet ds = new DataSet();         ad.Fill(ds);          WriteLine("    public partial class " + tb_name);        WriteLine("    {
"); foreach (DataRow dr in ds.Tables[0].Rows) { string fieldType=""; switch(dr["类型"].ToString()){ case "bit": fieldType="bool"; break; case "int": fieldType="int"; break; case "smallint": fieldType="int"; break; case "tinyint": fieldType="int"; break; case "bigint": fieldType="int"; break; case "float": fieldType="float"; break; case "double": fieldType="float"; break; case "decimal": fieldType="float"; break; case "datetime": fieldType="DateTime"; break; case "date": fieldType="DateTime"; break; case "smalldatetime": fieldType="DateTime"; break; case "timestamp": fieldType="int"; break; default: fieldType="string"; break; } string temp=" public " + fieldType +" " + dr["字段名"] + " { get; set; }"; if(!string.IsNullOrEmpty(dr["说明"].ToString())) temp += "//"+dr["说明"].ToString(); WriteLine(temp); } WriteLine(" }"); } conn.Close(); #>}

 

 

你可能感兴趣的文章
<<Information Store and Management>> 读书笔记 之八
查看>>
Windows 8 开发之设置合约
查看>>
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>