之前在公司写的CodeSmith生成模板

模板基类

最重要的文件


HeYangCodeSmithBase.cs

using System.Collections.Generic;
using SchemaExplorer;
using System.Data;
  
public class HeYangCodeSmithBase : CodeSmith.Engine.CodeTemplate
{
    public void SetTableInfo(TableSchema sourceTable)
    {
        this.TableInfo = sourceTable;
    }
  
  
    #region
    public List<FieldsInfo> FA = new List<FieldsInfo>();
    public List<FieldsInfo> FK = new List<FieldsInfo>();
    public List<FieldsInfo> FG = new List<FieldsInfo>();
    public List<FieldsInfo> FF = new List<FieldsInfo>();
    public SchemaExplorer.TableSchema TableInfo = null;
    public FieldsInfo FieldIdentity = null;
    public string TableName = string.Empty;
    public string ClassName
    {
        get
        {
            return this.TableInfo.Name.Replace("QNX_", "").Replace("_t", "").Replace("_", "");
        }
    }
    public void Init(TableSchema sourceTable)
    {
        this.TableInfo = sourceTable;
        this.TableName = this.TableInfo.Name;
        for (int index = 0; index < TableInfo.Columns.Count; index  )
        {
            FieldsInfo fieldsInfo = new FieldsInfo()
            {
                FieldName = TableInfo.Columns[index].Name,
                IsKey = TableInfo.Columns[index].IsPrimaryKeyMember,
                IsForeignKey = TableInfo.Columns[index].IsForeignKeyMember,
                VariableName = GetVariableName(TableInfo.Columns[index].Name),
                SQLType = DataType2SQLType(TableInfo.Columns[index]),
                CSharpType = DataType2CSharpType(TableInfo.Columns[index]),
                IsIdentity = (bool)(TableInfo.Columns[index].ExtendedProperties["CS_IsIdentity"].Value),
                Size = TableInfo.Columns[index].Size,
                Description = TableInfo.Columns[index].Description,
                Column = TableInfo.Columns[index],
            };
            if (fieldsInfo.IsKey)
                FK.Add(fieldsInfo);
            else
                FG.Add(fieldsInfo);
            if (fieldsInfo.IsForeignKey)
                FF.Add(fieldsInfo);
            if (fieldsInfo.IsIdentity)
                FieldIdentity = fieldsInfo;
            this.FA.Add(fieldsInfo);
        }
  
    }
  
    #endregion 
  
    #region -- modify --
    public string ProcedureName { get { return this.TableInfo.Name; } }
    public string ClassInfoName
    {
        get
        {
            return this.ClassName   "Model";
        }
    }
    public string NameSpace
    {
        get
        {
            return "TestDemo.WebApplication."   this.ClassName;
        }
    }
    #endregion
    #region -- base --
    public string GetDefaultValue(string type)
    {
        switch (type)
        {
            case "long":
                return "0";
        }
        return "_unknow_default_value_"   type;
    }
       
    public string GetIdentityReturnType()
    {
        if (this.FieldIdentity == null)
            return "bool";
        return this.FieldIdentity.CSharpType;
    }
  
    public string Get_Func_Param(List<FieldsInfo> list, int index)
    {
        var fieldInfo = list[index];
        string result = fieldInfo.CSharpType   " "   fieldInfo.VariableName;
        if (index < list.Count - 1)
            result  = ",";
        return result;
    }
  
    public string Get_FuncCMD_Param(List<FieldsInfo> list, int index, bool isOut)
    {
        string result = string.Empty;
        var fieldInfo = list[index];
        if (isOut)
        {
            if (fieldInfo.IsIdentity)
            {
                result  = "cmd.Parameters.AddWithValue(\"@"   fieldInfo.FieldName   "\", SqlDbType."   fieldInfo.SQLType   ");";
                result  = "cmd.Parameters[\"@"   fieldInfo.FieldName   "\"].Direction = ParameterDirection.Output;";
                return result;
            }
        }
        return "cmd.Parameters.AddWithValue(\"@"   fieldInfo.FieldName   "\", "   fieldInfo.VariableName   ");";
    }
    /// <summary>
    /// 获取存储过程的参数字符串
    /// </summary> 
    public string Get_SP_Param(List<FieldsInfo> list, int index, bool outPut)
    {
        var fieldInfo = list[index];
        string result = "@"   fieldInfo.FieldName   " "   fieldInfo.SQLType;
        if (fieldInfo.IsIdentity && outPut)
        {
            result  = " "   "OUTPUT";
        }
        else
        {
            if (IsLengthType(fieldInfo.Column.DataType))
                result  = "("   (fieldInfo.Size == -1 ? "MAX" : fieldInfo.Size.ToString())   ")";
        }
        if (index < list.Count - 1)
            result  = ",";
        return result;
    }
    public string Get_Param(List<FieldsInfo> list, int index, string prefix, string suffix, string filling)
    {
        var fieldInfo = list[index];
        return string.Format("{0}{1}{2}{3}", prefix, fieldInfo.FieldName, suffix, index < list.Count - 1 ? filling : string.Empty);
    }
  
    public string Get_Param(string filed, int index, int total)
    {
        return string.Format("{0}{1}", filed, index < total - 1 ? "," : string.Empty);
    }
  
  
    public string GetVariableName(string input)
    {
        string first = input.Substring(0, 1);
        return first.ToLower()   input.Substring(1);
    }
  
    public string DataType2SQLType(ColumnSchema column)
    {
        switch (column.NativeType.ToLower())
        {
            case "bigint": return "BigInt";
            case "binary": return "Binary";
            case "bit": return "Bit";
            case "char": return "Char";
            case "datetime": return "DateTime";
            case "decimal": return "Decimal";
            case "float": return "Float";
            case "image": return "Image";
            case "int": return "Int";
            case "money": return "Money";
            case "nchar": return "NChar";
            case "ntext": return "NText";
            case "numeric": return "Decimal";
            case "nvarchar": return "NVarChar";
            case "real": return "Real";
            case "smalldatetime": return "SmallDateTime";
            case "smallint": return "SmallInt";
            case "smallmoney": return "SmallMoney";
            case "sql_variant": return "Variant";
            case "sysname": return "NChar";
            case "text": return "Text";
            case "timestamp": return "Timestamp";
            case "tinyint": return "TinyInt";
            case "uniqueidentifier": return "UniqueIdentifier";
            case "varbinary": return "VarBinary";
            case "varchar": return "VarChar";
            default: return "__UNKNOWN__"   column.NativeType;
        }
    }
    public string DataType2CSharpType(ColumnSchema column)
    {
        switch (column.DataType)
        {
            case DbType.AnsiString: return "string";
            case DbType.AnsiStringFixedLength: return "string";
            case DbType.Binary: return "byte[]";
            case DbType.Boolean: return "bool";
            case DbType.Byte: return "byte";
            case DbType.Currency: return "decimal";
            case DbType.Date: return "DateTime";
            case DbType.DateTime: return "DateTime";
            case DbType.Decimal: return "decimal";
            case DbType.Double: return "double";
            case DbType.Guid: return "Guid";
            case DbType.Int16: return "short";
            case DbType.Int32: return "int";
            case DbType.Int64: return "long";
            case DbType.Object: return "object";
            case DbType.SByte: return "sbyte";
            case DbType.Single: return "float";
            case DbType.String: return "string";
            case DbType.StringFixedLength: return "string";
            case DbType.Time: return "TimeSpan";
            case DbType.UInt16: return "ushort";
            case DbType.UInt32: return "uint";
            case DbType.UInt64: return "ulong";
            case DbType.VarNumeric: return "decimal";
            default: return "__UNKNOWN__"   column.NativeType;
        }
    }
    public bool IsNumericType(ColumnSchema column)
    {
        switch (column.NativeType.ToLower())
        {
            case "bigint":
            case "bit":
            case "decimal":
            case "float":
            case "int":
            case "money":
            case "numeric":
            case "real":
            case "smallint":
            case "smallmoney":
            case "tinyint":
                return true;
            default:
                return false;
        }
    }
    public bool IsLengthType(DbType dataType)
    {
        switch (dataType)
        {
            case DbType.AnsiString:
            case DbType.AnsiStringFixedLength:
            case DbType.String:
            case DbType.StringFixedLength:
            case DbType.Binary:
                return true;
            default:
                return false;
        }
    }
    #endregion
}
  
public class DataInfo
{
    public string TableName { get; set; }
    public string ClassName { get; set; }
    public FieldsInfo FieldIdentity = new FieldsInfo();//自增主键
    public List<FieldsInfo> FA { get; set; } //Files All
    public int FAC { get { return this.FA.Count; } }
    public List<FieldsInfo> FK { get; set; } //Files Key
    public int FKC { get { return this.FK.Count; } }
    public List<FieldsInfo> FG { get; set; } //Files general
    public int FGC { get { return this.FG.Count; } }
    public List<FieldsInfo> FF { get; set; } //ForeignKey
    public int FFC { get { return this.FF.Count; } }
}
public class FieldsInfo
{
    public bool IsKey { get; set; }//是否主键
    public bool IsForeignKey { get; set; }//是否外键 
    public bool IsIdentity { get; set; }//是否自增主键
    public string FieldName { get; set; }//键名
    public string VariableName { get; set; }//变量名
    public string SQLType { get; set; }//数据库类型
    public string CSharpType { get; set; }//C#类型
    public int Size { get; set; } //长度
    public string Description { get; set; } //描述 
    public ColumnSchema Column { get; set; } //原始列
}



Leave a Reply