• T4模板生成自定义的实体类


    1、开发工具

      VS2017、Oracle、PL/SQL、T4Toolbox 

      T4模板编辑工具 T4 Editor

    2、数据库查询语句

      2.1、oracle

    --查询当前用户的所有表
    SELECT TABLE_NAME FROM USER_TABLES;
    --根据表名查询表结构数据
    SELECT A.column_name    字段名,                                                                                      
    A.data_type      数据类型,
    A.data_length    长度,
    A.data_precision 整数位,
    A.Data_Scale     小数位,
    A.nullable       允许空值,
    A.Data_default   缺省值,
    B.comments       备注,
    A.TABLE_NAME     表名
    FROM user_tab_columns A, user_col_comments B
    WHERE a.column_name = b.column_name
    AND A.Table_Name = B.Table_Name
    AND A.Table_Name = 'test'
    View Code

      2.2、mysql

    --查询数据库表
        string connectionString = "Data Source=.;Initial Catalog=NFineBase;User ID=sa;Password=hjf19870810;"; 
        SqlConnection conn = new SqlConnection(connectionString); 
        conn.Open(); 
        System.Data.DataTable schema = conn.GetSchema("TABLES"); 
    --通过数据库表查询表结构
    SELECT 表名=sobj.name,字段名=scol.name,字段说明=sprop.[value] FROM syscolumns as scol inner join sys.sysobjects as sobj on scol.id=sobj.id and sobj.xtype='U' and sobj.name<>'dtproperties' left join sys.extended_properties as sprop on scol.id=sprop.major_id and scol.colid=sprop.minor_id where sobj.name='@tableName' and scol.name='@columnName'
    View Code

      2.3、sqlserver

    --SQL 查询所有表名
    SELECT NAME FROM SYSOBJECTS WHERE TYPE='U'
    SELECT * FROM INFORMATION_SCHEMA.TABLES
    --查询表的所有字段名
    SELECT NAME FROM SYSCOLUMNS WHERE ID=OBJECT_ID(' 表名' )
    View Code

    3、生成类文件公用类 ModelAuto.ttinclude

    <#@ assembly name="System.Core"#>
    <#@ assembly name="EnvDTE"#>
    <#@ import namespace="System.Collections.Generic"#>
    <#@ import namespace="System.IO"#>
    <#@ import namespace="System.Text"#>
    <#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
    
    <#+
    
    class Manager
    {
        public struct Block {
            public String Name;
            public int Start, Length;
        }
    
        public List<Block> blocks = new List<Block>();
        public Block currentBlock;
        public Block footerBlock = new Block();
        public Block headerBlock = new Block();
        public ITextTemplatingEngineHost host;
        public ManagementStrategy strategy;
        public StringBuilder template;
        public String OutputPath { get; set; }
    
        public Manager(ITextTemplatingEngineHost host, StringBuilder template, bool commonHeader) {
            this.host = host;
            this.template = template;
            OutputPath = String.Empty;
            strategy = ManagementStrategy.Create(host);
        }
    
        public void StartBlock(String name) {
            currentBlock = new Block { Name = name, Start = template.Length };
        }
    
        public void StartFooter() {
            footerBlock.Start = template.Length;
        }
    
        public void EndFooter() {
            footerBlock.Length = template.Length - footerBlock.Start;
        }
    
        public void StartHeader() {
            headerBlock.Start = template.Length;
        }
    
        public void EndHeader() {
            headerBlock.Length = template.Length - headerBlock.Start;
        }    
    
        public void EndBlock() {
            currentBlock.Length = template.Length - currentBlock.Start;
            blocks.Add(currentBlock);
        }
    
        public void Process(bool split) {
            String header = template.ToString(headerBlock.Start, headerBlock.Length);
            String footer = template.ToString(footerBlock.Start, footerBlock.Length);
            blocks.Reverse();
            foreach(Block block in blocks) {
                String fileName = Path.Combine(OutputPath, block.Name);
                if (!Directory.Exists(OutputPath))
                {
                    Directory.CreateDirectory(OutputPath);
                }
                if (split) {
                    String content = header + template.ToString(block.Start, block.Length) + footer;
                    strategy.CreateFile(fileName, content);
                    template.Remove(block.Start, block.Length);
                } else {
                    strategy.DeleteFile(fileName);
                }
            }
        }
    }
    
    class ManagementStrategy
    {
        internal static ManagementStrategy Create(ITextTemplatingEngineHost host) {
            return (host is IServiceProvider) ? new VSManagementStrategy(host) : new ManagementStrategy(host);
        }
    
        internal ManagementStrategy(ITextTemplatingEngineHost host) { }
    
        internal virtual void CreateFile(String fileName, String content) {
            File.WriteAllText(fileName, content);
        }
    
        internal virtual void DeleteFile(String fileName) {
            if (File.Exists(fileName))
                File.Delete(fileName);
        }
    }
    
    class VSManagementStrategy : ManagementStrategy
    {
        private EnvDTE.ProjectItem templateProjectItem;
    
        internal VSManagementStrategy(ITextTemplatingEngineHost host) : base(host) {
            IServiceProvider hostServiceProvider = (IServiceProvider)host;
            if (hostServiceProvider == null)
                throw new ArgumentNullException("Could not obtain hostServiceProvider");
    
            EnvDTE.DTE 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);
        }
    
        internal override void CreateFile(String fileName, String content) {
            base.CreateFile(fileName, content);
            ((EventHandler)delegate { templateProjectItem.ProjectItems.AddFromFile(fileName); }).BeginInvoke(null, null, null, null);
        }
    
        internal override void DeleteFile(String fileName) {
            ((EventHandler)delegate { FindAndDeleteFile(fileName); }).BeginInvoke(null, null, null, null);
        }
    
        private void FindAndDeleteFile(String fileName) {
            foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) {
                if (projectItem.get_FileNames(0) == fileName) {
                    projectItem.Delete();
                    return;
                }
            }
        }
    }#>
    View Code

    4、T4模板文件

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ output extension=".cs" #>
    <#@ assembly name="System.Data" #>
    <#@ assembly name="System.Xml" #>
    <#@ assembly name="System.Linq" #>
    <#@ assembly name="System.IO" #>
    <#@ assembly name="$(ProjectDir)LibOracle.ManagedDataAccess.dll" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Xml" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Collections.Generic"#>
    <#@ import namespace="System.Linq"#>
    <#@ import namespace="Oracle.ManagedDataAccess.Client" #>
    <#@ include file="ModelAuto.ttinclude"#>
    
    <# var manager2 = new Manager(Host, GenerationEnvironment, true) { OutputPath = Path.GetDirectoryName(Host.TemplateFile)+"\DefaultModel"}; #>
    <# 
    ModelManager manager = new ModelManager();
    List<string> list=manager.GetTableList();
    #>
    
    <# 
        foreach (var item in list)
        {
            string tableName=item;
            DataTable table= manager.GetTableSchema(tableName);
     #>
    
     <# 
            string tempTableName=manager.FirstCharToUpper(tableName);
            manager2.StartBlock(tempTableName+"Entity.cs");
     #>
    /*********************************************************
    * Copyright (c) 2019
    * All rights reserved.
    * 
    * 文件名称:<#=tempTableName #>.cs
    * 摘    要:业务实体<#=tableName#>的对象
    *
    * 当前版本:1.0.0
    *
    * 作    者:test
    * 完成日期:<#=System.DateTime.Now.ToString("yyyy年MM月dd日") #>
    *
    *********************************************************/
    using System;
    
    namespace Common.Entity
    {
        /// <summary>
        /// 业务实体<#= tableName #>的对象
        /// </summary>
        [Serializable]
        public class <#= tempTableName  #>Entity: BaseEntity, ITableInfo
        {
            #region Parameter List
    <#
    foreach(DataRow row in table.Rows)
    {
    #>
            private <#= manager.TransFromSqlType(row["数据类型"].ToString(),row["整数位"].ToString(),row["小数位"].ToString())#> <#= row["字段名"].ToString().ToLower()#> = <#= manager.MapValue(row["数据类型"].ToString(),row["整数位"].ToString(),row["小数位"].ToString()) #>;    //<#= row["备注"]#>
    
    <#}
    #>
            private string tableName = "<#= tableName #>";
            private string tableSchema = "";
            #endregion
    
            #region Property List
    <#
    foreach(DataRow row in table.Rows)
    {
    #>
            /// <summary>
            /// <#=row["备注"]#>
            /// </summary>   
            public <#= manager.TransFromSqlType(row["数据类型"].ToString(),row["整数位"].ToString(),row["小数位"].ToString())#> <#= manager.FirstCharToUpper(row["字段名"].ToString())#>
            {
                get
                {
                    return <#= row["字段名"].ToString().ToLower() #>;
                }
                set
                {
                    <#= row["字段名"].ToString().ToLower() #> = value;
                }
            }
           
    <#}
    #>
            #endregion
    
            #region ITableInfo Members
            /// <summary>
            /// Database Table Name
            /// </summary>
            public string TableName
            {
                get
                {
                    return tableName;
                }
                set
                {
                    tableName = value;
                }
            }
    
            /// <summary>
            /// Database Table Schema
            /// </summary>
            public string TableSchema
            {
                get
                {
                    return tableSchema;
                }
                set
                {
                    tableSchema = value;
                }
            }
            #endregion
    
        }
    }
    
    <# manager2.EndBlock(); #>
    
    <#
        }  
     #>     
       
    <# manager2.Process(true); #>
    
    <#+
        public class ModelManager
        {
            /// <summary>
            /// 数据库连接字符串
            /// </summary>
           private const string CONNECTION_STRING = "DATA SOURCE=testPRO;USER ID=APP;PASSWORD=APP;";
            /// <summary>
            /// 用户信息表名
            /// </summary>
            private const string PERSONINFO_TABLE_NAME = "USERINFO";
            /// <summary>
            /// 根据表名查询表结构信息
            /// </summary>
            private const string SELECT_SCHEMA_BY_TABLE_NAME = @"SELECT A.column_name    字段名,                                                                                           
                                                                        A.data_type      数据类型,
                                                                        A.data_length    长度,
                                                                        A.data_precision 整数位,
                                                                        A.Data_Scale     小数位,
                                                                        A.nullable       允许空值,
                                                                        A.Data_default   缺省值,
                                                                        B.comments       备注,
                                                                        A.TABLE_NAME     表名
                                                                        FROM user_tab_columns A, user_col_comments B
                                                                        WHERE a.COLUMN_NAME = b.column_name
                                                                        AND A.Table_Name = B.Table_Name
                                                                        AND A.Table_Name = '{0}'";
    
            /// <summary>
            /// 获得数据连接
            /// </summary>
            /// <returns></returns>
            private OracleConnection GetConnection()
            {
                return new OracleConnection(CONNECTION_STRING);
            }
    
            /// <summary>
            /// 得到当前用户的所有表名
            /// </summary>
            /// <returns></returns>
            public List<string> GetTableList()
            {
                string sql = "SELECT * FROM USER_TABLES";
                DataTable dt = OracleHelper.ExecuteDataTable(sql);
                List<string> list = new List<string>();
                if (dt!=null&&dt.Rows.Count>0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        list.Add(dt.Rows[i]["TABLE_NAME"].ToString());
                    } 
                }
                return list;
             }
    
            /// <summary>
            /// 释放连接
            /// </summary>
            /// <param name="con"></param>
            private void ReleaseConnection(OracleConnection con)
            {
                if (con != null)
                {
                    if (con.State == ConnectionState.Open)
                    {
                        con.Close();
                    }
                }
            }
    
            public DataTable GetTableSchema(string tableName)
            {
                DataTable dt;
                using (OracleConnection con = GetConnection())
                {
                    con.Open();
                    OracleCommand cmd = con.CreateCommand();
                    cmd.CommandText = string.Format(SELECT_SCHEMA_BY_TABLE_NAME,tableName);
                    cmd.CommandType = CommandType.Text;
                    OracleDataAdapter adapter = new OracleDataAdapter(cmd);
                    DataSet ds = new DataSet(); 
                    adapter.Fill(ds);
                    dt = ds.Tables[0];
                }
    
                return dt;
            }
    
            public string FirstCharToUpper(string input)
            {
                if (String.IsNullOrEmpty(input))
                    throw new ArgumentException("ARGH!");
                return input.First().ToString().ToUpper() + input.Substring(1).ToLower();
            }
    
            public string MapValue(string type, string number, string small)
            {
                string dataType = TransFromSqlType(type, number, small);
                if (string.Equals(dataType, "string", StringComparison.OrdinalIgnoreCase))
                {
                    return "null";
                }
                else
                {
                    return dataType + ".MinValue";
                }
            }
    
            /// <summary>
            /// SQL[不完善,需要的自己改造]
            /// </summary>
            /// <param name="type"></param>
            /// <returns></returns>
            public string TransFromSqlType(string type, string number, string small)
            {
                if (string.IsNullOrEmpty(type))
                {
                    return string.Empty;
                }
                if (string.Equals(type, "number", StringComparison.OrdinalIgnoreCase))
                {
                    if (!string.IsNullOrEmpty(number))
                    {
                        if (!string.IsNullOrEmpty(small) && int.Parse(small) > 0)
                        {
                            return "decimal";
                        }
                        if (int.Parse(number) >= 10 && (string.IsNullOrEmpty(small) || (!string.IsNullOrEmpty(small)&&int.Parse(small)==0)))
                        {
                            return "Int64";
                        }
                        else if (int.Parse(number) < 10 && (string.IsNullOrEmpty(small) || (!string.IsNullOrEmpty(small) && int.Parse(small) == 0)))
                        {
                            return "Int32";
                        }
                       
                    }
                    else
                    {
                        return "Int32";
                    }
                }
                if (string.Equals(type, "date", StringComparison.OrdinalIgnoreCase))
                {
                    return "DateTime";
                }
                else if (string.Equals(type, "nvarchar2", StringComparison.OrdinalIgnoreCase) || string.Equals(type, "char", StringComparison.OrdinalIgnoreCase))
                {
                    return "string";
                }
                return "string";
            }
    
        }
    #>
    
    <#+ 
    public class OracleHelper
        {
    
            private static string oracleConnectionStr = "DATA SOURCE=testPRO;USER ID=APP;PASSWORD=APP;";
            public static DataTable ExecuteDataTable(string sql, params OracleParameter[] paramList)
            {
                using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
                {
                    conn.Open();
                    using (OracleCommand command = conn.CreateCommand())
                    {
                        command.CommandText = sql;
                        command.Parameters.AddRange(paramList);
                        DataTable dt = new DataTable();
                        OracleDataAdapter adapter = new OracleDataAdapter(command);
                        adapter.Fill(dt);
                        return dt;
                    }
                }
            }
    
            public static int ExecuteNonQuery(string sql, params OracleParameter[] paramList)
            {
                using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
                {
                    conn.Open();
                    using (OracleCommand command = conn.CreateCommand())
                    {
                        command.CommandText = sql;
                        command.Parameters.AddRange(paramList);
                        return command.ExecuteNonQuery();
                    }
                }
            }
    
            public static object ExecuteScalar(string sql, params OracleParameter[] paramList)
            {
                using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
                {
                    conn.Open();
                    using (OracleCommand command = conn.CreateCommand())
                    {
                        command.CommandText = sql;
                        command.Parameters.AddRange(paramList);
                        return command.ExecuteScalar();
                    }
                }
            }
        }
    
     #>
    View Code

     生成文件如下图

    5、T4模板语法

      主要分为 1指令 2文本块 3指令块

      <# 标准控制块 #> 可以包含语句。
      <#= 表达式控制块 #> 可以包含表达式。
      <#+ 类功能控制块 #> 可以包含方法、字段和属性,就像一个类的内部

      5.1 指令

      主要包括template, output, assembly, import, include等类型

      $(SolutionDir):当前项目所在解决方案目录
      $(ProjectDir):当前项目所在目录
      $(TargetPath):当前项目编译输出文件绝对路径
      $(TargetDir):当前项目编译输出目录,即web项目的Bin目录,控制台、类库项目bin目录下的debug或release目录(取决于当前的编译模式)

      5.2 文本块

      文本块直接向输出文件插入文本。 文本块没有特殊格式,就像我们刚才初体验中写的类一样。

      5.3 指令块

      标准控制块:

    <#
        for(int i = 0; i < 4; i++)
        {
    #>
    Hello World!
    <#
        } 
    #>
    View Code

      表达式控制块:

    <#
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(@"E:CSharpOverview.xml");
        XmlAttributeCollection attributes = xDoc.Attributes;
        if (attributes != null)
        {
           foreach (XmlAttribute attr in attributes)
           {
    #><#= attr.Name #><#
           }
        }
    #>
    View Code

      类功能控制块:

    <#+ 
    public class OracleHelper
        {
    
            private static string oracleConnectionStr = "DATA SOURCE=testPRO;USER ID=APP;PASSWORD=APP;";
            public static DataTable ExecuteDataTable(string sql, params OracleParameter[] paramList)
            {
                using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
                {
                    conn.Open();
                    using (OracleCommand command = conn.CreateCommand())
                    {
                        command.CommandText = sql;
                        command.Parameters.AddRange(paramList);
                        DataTable dt = new DataTable();
                        OracleDataAdapter adapter = new OracleDataAdapter(command);
                        adapter.Fill(dt);
                        return dt;
                    }
                }
            }
    
            public static int ExecuteNonQuery(string sql, params OracleParameter[] paramList)
            {
                using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
                {
                    conn.Open();
                    using (OracleCommand command = conn.CreateCommand())
                    {
                        command.CommandText = sql;
                        command.Parameters.AddRange(paramList);
                        return command.ExecuteNonQuery();
                    }
                }
            }
    
            public static object ExecuteScalar(string sql, params OracleParameter[] paramList)
            {
                using (OracleConnection conn = new OracleConnection(oracleConnectionStr))
                {
                    conn.Open();
                    using (OracleCommand command = conn.CreateCommand())
                    {
                        command.CommandText = sql;
                        command.Parameters.AddRange(paramList);
                        return command.ExecuteScalar();
                    }
                }
            }
        }
    
     #>
    View Code

    更多的T4模板语法参考 https://docs.microsoft.com/zh-cn/visualstudio/modeling/code-generation-and-t4-text-templates?view=vs-2015

    参考:https://www.cnblogs.com/fenglingyi/p/5927082.html

       https://www.cnblogs.com/maiaimei/p/8994552.html

  • 相关阅读:
    随机读取记录
    js 抓取Google词库内容(仅供学习)
    分组统查询
    计时执行后台方法2
    js 调用WinForm角本
    vs2005 确保已安装文件类型(*.*)错误
    原创:SQL Server 数据库附加分离类
    Ajax Js倒计时执行后台方法
    空间前方交会和空间后方交会的区别
    cesium支持的3d模型格式
  • 原文地址:https://www.cnblogs.com/ZJ199012/p/12009781.html
Copyright © 2020-2023  润新知