codesmith使用

本文介绍如何使用CodeSmith来自动生成C#代码,包括实体类和数据访问层等,并提供了详细的步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装后

破解

将两个dll烤到安装目录下!

 自己制作CodeTemplateRule

将CodeSmith.Engine(在bin目录里)和SchemaExplorer(在AddIns目录里)  两个类添加到引用

 

 

using System;
using System.Text;
using System.ComponentModel;
using CodeSmith.Engine;
using System.Data;
using SchemaExplorer;

namespace CodeTemplateRule
{
    
/**/
    
/// <summary>
    
/// CodeSmith自动生成代码所用到的函数
    
/// </summary>
    public class CodeTemplateRule
    {
        
/**/
        
/// <summary>
        
/// 获取所有列的集合
        
/// </summary>
        
/// <param name="dataBase">数据库Schema</param>
        
/// <param name="tableName">表名</param>
        
/// <returns>Columns Schema</returns>
        public ColumnSchemaCollection GetColumnCollection(DatabaseSchema dataBase, string tableName)
        {
            TableSchemaCollection tables 
= new TableSchemaCollection(dataBase.Tables);
            ColumnSchemaCollection columns 
= null;
            
for (int i = 0; i < tables.Count; i++)
            {
                
if (tables[i].Name.ToUpper() == tableName.ToUpper())
                {
                    TableSchema ts 
= tables[i];
                    columns 
= new ColumnSchemaCollection(ts.Columns);
                }
            }
            
return columns;
        }

        
/**/
        
/// <summary>
        
/// 获取处理后的表名 例如:ORG_Person,返回Person
        
/// </summary>
        
/// <param name="tableName">表名</param>
        
/// <returns>返回处理后的表名</returns>
        public string GetTableName(string tableName)
        {
            
int i = tableName.IndexOf("_");
            
return tableName.Substring(i + 1, tableName.Length - (i + 1));
        }

        
/**/
        
/// <summary>
        
/// 获取唯一号的变量名,第一个字母小写
        
/// </summary>
        
/// <param name="guidColumn">唯一号列名</param>
        
/// <returns>唯一号的变量名</returns>
        public string GetGuidColumnVar(string guidColumn)
        {
            
string guid;
            guid 
= guidColumn.Substring(01).ToLower() + guidColumn.Substring(1, guidColumn.Length - 1);
            
return guid;
        }

        
/**/
        
/// <summary>
        
/// 获取c#变量类型
        
/// </summary>
        
/// <param name="column"></param>
        
/// <returns>c#变量类型</returns>
        public string GetType(ColumnSchema column)
        {
            
if (column.Name.EndsWith("TypeCode")) return column.Name;

            
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 "int";
                
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;
                    }
            }
        }

        
/**/
        
/// <summary>
        
/// 获取c#变量类型默认值
        
/// </summary>
        
/// <param name="column"></param>
        
/// <returns>c#变量类型默认值</returns>
        public string GetDefaultValue(ColumnSchema column)
        {
            
if (column.Name.EndsWith("TypeCode")) return column.Name;

            
switch (column.DataType)
            {
                
case DbType.AnsiString: return "\"\"";
                
case DbType.AnsiStringFixedLength: return "\"\"";
                
case DbType.Binary: return "null";
                
case DbType.Boolean: return "false";
                
case DbType.Byte: return "0";
                
case DbType.Currency: return "0";
                
case DbType.Date: return "DateTime.Parse(\"1900-1-1\")";
                
case DbType.DateTime: return "DateTime.Parse(\"1900-1-1\")";
                
case DbType.Decimal: return "0";
                
case DbType.Double: return "0";
                
case DbType.Guid: return "Guid.NewGuid().ToString()";
                
case DbType.Int16: return "0";
                
case DbType.Int32: return "0";
                
case DbType.Int64: return "0";
                
case DbType.Object: return "\"\"";
                
case DbType.SByte: return "0";
                
case DbType.Single: return "0";
                
case DbType.String: return "\"\"";
                
case DbType.StringFixedLength: return "";
                
case DbType.Time: return "DateTime.Parse(\"1900-1-1\")";
                
case DbType.UInt16: return "0";
                
case DbType.UInt32: return "0";
                
case DbType.UInt64: return "0";
                
case DbType.VarNumeric: return "0";
                
default:
                    {
                        
return "__UNKNOWN__" + column.NativeType;
                    }
            }
        }

        
/**/
        
/// <summary>
        
/// 获取c#变量类型默认值
        
/// </summary>
        
/// <param name="column"></param>
        
/// <returns>c#变量类型默认值</returns>
        public string GetConvert(ColumnSchema column)
        {
            
if (column.Name.EndsWith("TypeCode")) return column.Name;

            
switch (column.DataType)
            {
                
case DbType.AnsiString: return "Convert.ToString";
                
case DbType.AnsiStringFixedLength: return "Convert.ToString";
                
case DbType.Binary: return "Convert.ToByte";
                
case DbType.Boolean: return "Convert.ToBoolean";
                
case DbType.Byte: return "Convert.ToInt32";
                
case DbType.Currency: return "Convert.ToDecimal";
                
case DbType.Date: return "Convert.DateTime";
                
case DbType.DateTime: return "Convert.DateTime";
                
case DbType.Decimal: return "Convert.ToDecimal";
                
case DbType.Double: return "Convert.ToDouble";
                
case DbType.Guid: return "Convert.ToString";
                
case DbType.Int16: return "Convert.ToInt16";
                
case DbType.Int32: return "Convert.ToInt32";
                
case DbType.Int64: return "Convert.ToInt64";
                
case DbType.Object: return "Convert.ToString";
                
case DbType.SByte: return "Convert.ToByte";
                
case DbType.Single: return "Convert.ToInt32";
                
case DbType.String: return "Convert.ToString";
                
case DbType.StringFixedLength: return "Convert.ToString";
                
case DbType.Time: return "Convert.DateTime";
                
case DbType.UInt16: return "Convert.ToUInt16";
                
case DbType.UInt32: return "Convert.ToUInt32";
                
case DbType.UInt64: return "Convert.ToUInt64";
                
case DbType.VarNumeric: return "Convert.ToDecimal";
                
default:
                    {
                        
return "__UNKNOWN__" + column.NativeType;
                    }
            }
        }
    }
}

 

 

将 重新编译生成的CodeTemplateRule拷贝到 codesmith目录下的 两个文件夹中

 

模板页中添加引用

ContractedBlock.gifExpandedBlockStart.gifCode
<%-- 
Name:模板
Author: awp
Description: 生成模板
--%>
<%@ CodeTemplate Language="C#" ResponseEncoding="UTF-8"  TargetLanguage="Text" Description="Template description here." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Assembly Name="CodeTemplateRule" %>
<%@ Import Namespace="CodeTemplateRule" %>
<%--模板属性--%>
<%@ Property Name="DataBase" Type="SchemaExplorer.DatabaseSchema" Category="Context" Description="数据库连接." %>
<%@ Property Name="TableName" Type="System.String" Default="t_User" Optional="False" Category="" Description="表名" %>
<%@ Property Name="Model" Type="System.String" Default="Bs.Model" Optional="False" Category="" Description="实体类命名空间" %>
<%@ Property Name="DAL" Type="System.String" Default="Bs.DAL" Optional="False" Category="" Description="数据层命名空间" %>
<%@ Property Name="BLL" Type="System.String" Default="Bs.BLL" Optional="False" Category="" Description="业务逻辑层命名空间" %>
<%@ Property Name="SQLHelper" Type="System.String" Default="Bs.SQLHelper" Optional="False" Category="" Description="数据操作层命名空间" %>
<%@ Property Name="Author" Type="System.String" Default="awp" Optional="False" Category="" Description="作者" %>
<%@ Property Name="Description" Type="System.String" Default="实体类" Optional="False" Category="" Description="该类的描述" %>
<script runat="template">
 CodeTemplateRule rule
=new CodeTemplateRule();
</script> 


using System;

namespace <%= Model %>
{
    
/// <summary>
    
/// 实体类:<%= rule.GetTableName(TableName) %>Info 数据实体
    
/// 描述:<%
TableSchema table=DataBase.Tables["t_"+rule.GetTableName(TableName)];

%>
    
/// 作者:<%= Author %>
    
/// 日期:<%= DateTime.Now.ToString() %>
    
///</summary>

    
public class <%= rule.GetTableName(TableName) %>Info
    {                
          
#region 变量定义
<%

        ColumnSchemaCollection columns
=rule.GetColumnCollection(DataBase,TableName);
        
for(int i=0;i<columns.Count;i++)
        {
            
string des="";

            
if(columns[i].Description.Length>0)
            {
                des
=columns[i].Description;
            }
            
            
switch(rule.GetType(columns[i]))
            {
                
case "int":
                    
%>
                    
private int _<%=columns[i].Name%>;//<%=des%>
                    <%
                    
break;
                
case "string":
                    
%>
                    
private string _<%=columns[i].Name%>;//<%=des%>
                    <%
                    
break;
                
case "DateTime":
                    
%>
                    
private DateTime _<%=columns[i].Name%>;//<%=des%>
                    <%
                    
break;
                
default:
                    
%>
                    
private string _<%=columns[i].Name%>;//<%=des%>
                    <%
                
break;
            }

        }
%>
        
#endregion 变量定义

        
///<summary>
        
///构造函数
        
///</summary>
        public <%= rule.GetTableName(TableName)+"Info()" %>
        {
<%
        
for(int i=0;i<columns.Count;i++)
        {
            
switch(rule.GetType(columns[i]))
            {
                
case "int":
                    Response.Write(
"            _"+columns[i].Name+" = int.MaxValue;\r\n");
                    
break;
                
case "string":
                    Response.Write(
"            _"+columns[i].Name+" = null;\r\n");
                    
break;
                
case "DateTime":
                    Response.Write(
"            _"+columns[i].Name+" = DateTime.MinValue;\r\n");
                    
break;
                
default:
                    Response.Write(
"            _"+columns[i].Name+" = null;\r\n");
                
break;
            }
        }
%>
        }


         
#region 公共属性
<%
        
for(int i=0;i<columns.Count;i++)
        {
%> 
          
///<summary>
        
///<%if(columns[i].Description.Length>0){ Response.Write(columns[i].Description);}else{Response.Write(columns[i].Name);}%>
        
///</summary>
        public <%= rule.GetType(columns[i]) %> <%= columns[i].Name%>
        {
            
get{
                
return _<%= columns[i].Name %>;
            }
            
set{
                _
<%= columns[i].Name %>=value;
                }
        }
<%   
          }
%> 
        
#endregion 公共属性
        
        
    }
}

**********************************************************

using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Text;
using <%=SQLHelper%>;
using <%=Model%>;


namespace <%=DAL %>
{    
     
    
    
/// <summary>
    
/// 数据操作层类:DAL<%= rule.GetTableName(TableName) %> 
    
/// 描述:<%
    
    
    
%>
    
/// 作者:<%= Author %>
    
/// 日期:<%= DateTime.Now.ToString() %>
    
///</summary>
    public class DAL<%= rule.GetTableName(TableName) %>
    {    
        
/// <summary>
        
/// 构造函数
        
/// </summary>
          public DAL<%= rule.GetTableName(TableName) %>(string tableName)
        {
            
this.TableName = tableName;
        }


        
#region 重写继承的DataBase类的的方法 (为了实现多表的功能)


        
public override int GetCountVir(string sqlStr)
        {
            
return SqlHelper.ExecuteNonQuery(sqlStr, null);
        }

        
public override int GetSumVir(string sqlStr)
        {
            
return SqlHelper.ExecuteNonQuery(sqlStr, null);
        }

        
public override SqlDataReader GetListDrVir(string sqlStr)
        {
            
return SqlHelper.ExecuteReader(sqlStr);
        }

        
public override DataSet GetListDsVir(string sqlStr)
        {
            
return SqlHelper.ExecuteDataset(sqlStr);
        }

        
public override DataTable GetListDtVir(string sqlStr)
        {
            
return SqlHelper.ExecuteDataset(sqlStr).Tables[0];
        }

        
public override bool ExistsVir(string sqlStr)
        {
            
if (SqlHelper.ExecuteNonQuery(sqlStr, null> 0)
            {
                
return true;

            }
            
else
            {
                
return false;
            }

        }



        
#endregion
        
         
#region Add增加一条数据
        
/// <summary>
        
/// 增加一条数据
        
/// </summary>
        
/// <param name="model">实体类</param>
        
/// <returns>新增数据的ID</returns>
        public int Add(<%= rule.GetTableName(TableName) %>Info model)
        {
            StringBuilder strSql 
= new StringBuilder();
            strSql.Append(
"insert into t_<%= rule.GetTableName(TableName) %>(");
            
            
<%string sqlStr="";
            
string sqlStr2="";
        
for(int i=0;i<columns.Count;i++)
        {
            
            
if(i+1==columns.Count)
            {
                sqlStr
+=columns[i].Name;
                sqlStr2
+="@"+columns[i].Name;
            }
            
else
            {
                sqlStr
+=columns[i].Name+",";
                sqlStr2
+="@"+columns[i].Name+",";
            }
            
        }
%>
            
            strSql.Append(
"<%=sqlStr%>");
            strSql.Append(
")");
            strSql.Append(
" values (");
            strSql.Append(
"<%=sqlStr2%>");
            strSql.Append(
")");
            strSql.Append(
";select @@IDENTITY");

            
//获取参数
            SqlParameter[] parameters = GetParameters("<%=rule.GetTableName(TableName)%>Add");
            
            
<%
                
for(int i=0;i<columns.Count;i++)
                {
                    
%>
                     parameters[
<%=i%>].Value = model.<%=columns[i].Name%>;
                    
<%
                }
            
            
%>


            
int ID = int.Parse(SqlHelper.ExecuteScalar(strSql.ToString(), parameters).ToString());

            OnAdd(ID);
//可以表示在添加前还是后执行这个事件 
            
//比如在 注册事件中应该是 添加成功后进行登入操作

            
return ID;
        }
        
#endregion
        
           
#region Update 更新
        
public bool Update(<%= rule.GetTableName(TableName) %>Info model)
        {


            StringBuilder strSql 
= new StringBuilder();
            strSql.Append(
"update t_<%= rule.GetTableName(TableName) %> set ");

            SqlParameter[] parms 
= {
                
new SqlParameter("@ID", SqlDbType.Int, 4)
                                   };

            parms[
0].Value = model.ID;

            
int j = 1;
            
            
<% 
            
for(int i=0;i<columns.Count;i++)
            {
                
if(columns[i].Name!="ID")
                {
                
                        
                        
switch(rule.GetType(columns[i]))
                        {
                            
case "int":
                                
%>
                                    
if (model.<%=columns[i].Name%> != int.MaxValue)
                                    {
                                    strSql.Append(
" <%=columns[i].Name%>=@<%=columns[i].Name%>,");
                                    Array.Resize
<SqlParameter>(ref parms, parms.Length + 1);
                                    parms[j] 
= new SqlParameter("@<%=columns[i].Name%>", SqlDbType.Int,<%=columns[i].Size%>);
                                    parms[j].Value 
= model.<%=columns[i].Name%>;
                                    j 
= j + 1;
                                    }
                                
<%
                                
break;
                            
case "string":
                                
%>
                                     
if (model.<%=columns[i].Name%> != null)
                                    {
                                    strSql.Append(
" <%=columns[i].Name%>=@<%=columns[i].Name%>,");
                                    Array.Resize
<SqlParameter>(ref parms, parms.Length + 1);
                                    parms[j] 
= new SqlParameter("@<%=columns[i].Name%>", SqlDbType.VarChar,<%=columns[i].Size%>);
                                    parms[j].Value 
= model.<%=columns[i].Name%>;
                                    j 
= j + 1;
                                    }
                                
<%
                                
break;
                            
case "DateTime":
                                
%>
                                     
if (model.<%=columns[i].Name%> !=  DateTime.MinValue)
                                    {
                                    strSql.Append(
" <%=columns[i].Name%>=@<%=columns[i].Name%>,");
                                    Array.Resize
<SqlParameter>(ref parms, parms.Length + 1);
                                    parms[j] 
= new SqlParameter("@<%=columns[i].Name%>", SqlDbType.DateTime);
                                    parms[j].Value 
= model.<%=columns[i].Name%>;
                                    j 
= j + 1;
                                    }
                                
<%
                                
break;
                            
default:
                                
%>
                                    
if (model.<%=columns[i].Name%> != null)
                                    {
                                    strSql.Append(
" Address=@Address,");
                                    Array.Resize
<SqlParameter>(ref parms, parms.Length + 1);
                                    parms[j] 
= new SqlParameter("@Address", SqlDbType.VarChar, 200);
                                    parms[j].Value 
= model.Address;
                                    j 
= j + 1;
                                    }
                                
<%
                            
break;
                        }
                        
                    
                }
                
            }
            
            
%>



            strSql 
= strSql.Remove(strSql.Length - 11);


            strSql.Append(
" where ID=@ID");

            
if (SqlHelper.ExecuteNonQuery(strSql.ToString(), parms) > 0)
            {
                OnUpdate(
"");
                
return true;
            }
            
else
            {
                
return false;
            }


        }
        
#endregion
        
         
#region GetModel 得到一个实体对象
        
/// <summary>
        
/// 得到一个实体对象
        
/// </summary>
        
/// <param name="ID">主键ID</param>
        
/// <returns></returns>
        public <%= rule.GetTableName(TableName) %>Info GetModel(int ID)
        {
            StringBuilder strSql 
= new StringBuilder();
                
<% sqlStr="";
            
        
for(int i=0;i<columns.Count;i++)
        {
            
            
if(i+1==columns.Count)
            {
                sqlStr
+=columns[i].Name;
                
            }
            
else
            {
                sqlStr
+=columns[i].Name+",";
                
            }
            
        }
%>
            
            strSql.Append(
"SELECT  <%=sqlStr%> FROM t_<%= rule.GetTableName(TableName) %> ");
            strSql.Append(
" where ID=@ID ");
            SqlParameter[] parameters 
= {
                    
new SqlParameter("@ID", SqlDbType.Int,4)};
            parameters[
0].Value = ID;
            
<%= rule.GetTableName(TableName) %>Info model = new <%= rule.GetTableName(TableName) %>Info();
            
using (SqlDataReader dr = SqlHelper.ExecuteReader(strSql.ToString(), parameters))
            {
                
while (dr.Read())
                {
                
<%
                
for(int i=0;i<columns.Count;i++)
                {
                    
switch(rule.GetType(columns[i]))
                    {
                        
case "int":
                                
%>
                                model.
<%=columns[i].Name%> = dr.GetInt32(<%=i%>);   
                                
<%
                                
break;
                            
case "string":
                                
%>
                                model.
<%=columns[i].Name%> = dr.GetString(<%=i%>);     
                                
<%
                                
break;
                            
case "DateTime":
                                
%>
                                model.
<%=columns[i].Name%> = dr.GetDateTime(<%=i%>);     
                                
<%
                                
break;
                            
default:
                                
%>
                                 
                                
<%
                            
break;
                    }
                        
                    
                }
                
                
%>
                    
                 

                }

            }
            
return model;
        }

        
/// <summary>
        
/// 得到一个实体对象
        
/// </summary>
        
/// <param name="where">where条件 eg: name='awp'</param>
        
/// <returns></returns>
        public <%= rule.GetTableName(TableName) %>Info GetModel(string where)
        {
            StringBuilder strSql 
= new StringBuilder();
          
<% sqlStr="";
            
        
for(int i=0;i<columns.Count;i++)
        {
            
            
if(i+1==columns.Count)
            {
                sqlStr
+=columns[i].Name;
                
            }
            
else
            {
                sqlStr
+=columns[i].Name+",";
                
            }
            
        }
%>
            
            strSql.Append(
"SELECT  <%=sqlStr%> FROM t_<%= rule.GetTableName(TableName) %> ");
            
if (!string.IsNullOrEmpty(where))
            {
                strSql.Append(
" where  " + where);
            }

            
<%= rule.GetTableName(TableName) %>Info model = new <%= rule.GetTableName(TableName) %>Info();
            
using (SqlDataReader dr = SqlHelper.ExecuteReader(strSql.ToString(), null))
            {
                
while (dr.Read())
                {
                 
<%
                
for(int i=0;i<columns.Count;i++)
                {
                    
switch(rule.GetType(columns[i]))
                    {
                        
case "int":
                                
%>
                                model.
<%=columns[i].Name%> = dr.GetInt32(<%=i%>);   
                                
<%
                                
break;
                            
case "string":
                                
%>
                                model.
<%=columns[i].Name%> = dr.GetString(<%=i%>);     
                                
<%
                                
break;
                            
case "DateTime":
                                
%>
                                model.
<%=columns[i].Name%> = dr.GetDateTime(<%=i%>);     
                                
<%
                                
break;
                            
default:
                                
%>
                                 
                                
<%
                            
break;
                    }
                        
                    
                }
                
                
%>
                }

            }
            
return model;
        }
        
#endregion
        
        
        
#region 参数处理

        
private static SqlParameter[] GetParameters(string Keys)
        {
            
//从缓存中获取参数 如果不存在 重新生成
            SqlParameter[] parms = SqlHelper.GetCachedParameters(Keys);

            
if (parms == null)
            {

                parms 
= new SqlParameter[] {
                
<%
                
for(int i=0;i<columns.Count;i++)
                {
                    
switch(rule.GetType(columns[i]))
                    {
                            
case "int":
                                
%>
                                
new SqlParameter("@<%=columns[i].Name%>", SqlDbType.Int,<%=columns[i].Size%>),
                                
<%
                                
break;
                            
case "string":
                                
%>
                                
new SqlParameter("@<%=columns[i].Name%>",  SqlDbType.VarChar,<%=columns[i].Size%>),
                                
<%
                                
break;
                            
case "DateTime":
                                
%>
                                
new SqlParameter("@<%=columns[i].Name%>", SqlDbType.DateTime),     
                                
<%
                                
break;
                            
default:
                                
%>
                                
new SqlParameter("@<%=columns[i].Name%>", SqlDbType.<%=rule.GetType(columns[i])%>),
                                
<%
                            
break;
                    }
                }    
                
%>
                                        };
                SqlHelper.CacheParameters(Keys, parms);
            }

            
return parms;
        }

        
#endregion
        

        
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值