其实CodeSmith自带的例子是很好的学习材料,其中一个例子就有批量生成所有表(指定表)并存放到指定目录的,但例子还是归例子,要符合实际需要的使用,还是得改一下的。下面发布下本人修改后的批量生成多种模板多个表的代码文件,并存放到指定目录下:
<%
@ CodeTemplate Language
=
"
C#
"
TargetLanguage
=
"
C#
"
Src
=
""
Inherits
=
""
Debug
=
"
True
"
CompilerVersion
=
"
v3.5
"
ResponseEncoding
=
"
UTF-8
"
Description
=
"
输出所有模块文件
"
%>
<%-- Context --%>
<%-- Object --%>
<% @ Property Name = " NameSpace " Type = " System.String " Default = " NameSpace " Category = " Object " Description = " 项目的命名空间 " %>
<% @ Property Name = " Assembly " Type = " System.String " Default = " Assembly " Category = " Object " Description = " 项目的程序集 " %>
<% @ Property Name = " TableDivideMark " Type = " System.String " Default = " _ " Category = " Object " Description = " 表名分隔符 " %>
<% @ Property Name = " TablePrefix " Type = " System.Boolean " Default = " true " Category = " Object " Description = " 是否有表前缀,如果存在表前缀的,会自动把第一个表名分隔符前的表前缀删除掉。 " %>
<% @ Property Name = " TablePrefixLength " Type = " System.Int32 " Default = " 4 " Category = " Object " Description = " 表前缀长度,如果表前缀大于这个值,则认为没有表前缀 " %>
<% @ Property Name = " ColumnDivideMark " Type = " System.String " Default = " _ " Category = " Object " Description = " 字段名分隔符 " %>
<% @ Property Name = " ColumnPrefix " Type = " System.Boolean " Default = " false " Category = " Object " Description = " 是否有字段前缀,如果存在字段前缀的,会自动把第一个字段名分隔符前的字段前缀删除掉。 " %>
<% @ Property Name = " ColumnPrefixLength " Type = " System.Int32 " Default = " 0 " Category = " Object " Description = " 字段前缀长度,如果字段前缀大于这个值,则认为没有字段前缀 " %>
<% @ Property Name = " ForceId " Type = " System.Boolean " Default = " true " Category = " Object " Description = " 强制性自增量标识主键 " %>
<% @ Property Name = " ForceIdProperty " Type = " System.String " Default = " ID " Category = " Object " Description = " 强制性自增量标识主键的属性名称 " %>
<% @ Property Name = " SourceTableNames " Type = " System.String " Default = "" Category = " Object " Description = " 当指定表名时,只执行字符串中表名列表中的表 " %>
<%-- Context --%>
<% @ Assembly Name = " System.Design " %>
<% @ Assembly Name = " SchemaExplorer " %>
<% @ Import Namespace = " SchemaExplorer " %>
<% @ Import Namespace = " System.IO " %>
<% @ Import Namespace = " System.Xml " %>
<% @ Import Namespace = " System.Text " %>
<% @ Import Namespace = " System.Windows.Forms.Design " %>
<% @ Import Namespace = " System.Text.RegularExpressions " %>
<% @ Import Namespace = " System.Collections.Specialized " %>
< script runat = " template " >
private DatabaseSchema _sourceDatabase;
private string _outputDirectory;
private bool _implementNotification = true ;
// 模板对象列表(根据模板名称产生出来的模板对象)
public CodeTemplate[] CurrentTemplates;
// 模板名称数组
public string [] TemplateNames = { " piggy_projectFileInclue.cst " , " piggy_SqlMap.config.cst " , " piggy_dao.config.cst " , " piggy_service.config.cst " , " piggy_Model_Auto.cst " , " iBatis_sqlmap_Auto.cst " , " piggy_Service.cst " , " piggy_Model.cst " , " piggy_DAL.cst " , " piggy_BLL.cst " , " iBatis_sqlmap.cst " };
// 模板输出格式数组
public string [] strFormats = { " projectFileInclue.txt " , " sqlmap.config " , " Dao_Auto.config " , " Service_Auto.config " , " {0}_Auto.cs " , " {0}_Auto.xml " , " I{0}BLL.cs " , " {0}.cs " , " {0}DAO.cs " , " {0}BLL.cs " , " {0}.xml " };
// 模板输出路径
public string [] OutputPaths = { "" , " \\Data " , " \\Data\\config " , " \\Data\\config " , " \\Data_Auto\\Model " , " \\Data_Auto\\Map " , " \\Data\\service " , " \\Data\\Model " , " \\Data\\DAL " , " \\Data\\BLL " , " \\Data\\Map " };
[Category( " Database " )]
[Description( " Database that the mapping file should be based on. " )]
public DatabaseSchema SourceDatabase {
get { return _sourceDatabase; }
set { _sourceDatabase = value; }
}
[Editor( typeof (System.Windows.Forms.Design.FolderNameEditor), typeof (System.Drawing.Design.UITypeEditor))]
[Category( " Class " )]
[Description( " The folder to save the generated class files. " )]
public string OutputDirectory
{
get { return _outputDirectory;}
set {_outputDirectory = value;}
}
// 根据模板名称产生出来的模板对象列表
public void CreateTemplate()
{
if (CurrentTemplates == null )
{
CurrentTemplates = new CodeTemplate[TemplateNames.Length];
for ( int i = 0 ; i < TemplateNames.Length; i ++ )
{
CurrentTemplates[i] = CompileTemplate(CodeTemplateInfo.DirectoryName + TemplateNames[i]);
}
}
}
// 单独生成一个模板对象
public CodeTemplate CompileTemplate( string templateName)
{
CodeTemplateCompiler compiler = new CodeTemplateCompiler(templateName);
compiler.Compile();
if (compiler.Errors.Count == 0 )
{
return compiler.CreateInstance();
}
else
{
for ( int i = 0 ; i < compiler.Errors.Count; i ++ )
{
Response.WriteLine(compiler.Errors[i].ToString());
}
return null ;
}
}
// 执行输出脚本
public void Generate()
{
if (CurrentTemplates == null )
CreateTemplate();
StringCollection ExcludedTables = new StringCollection();
if (SourceTableNames.Length > 0 )
{
int mIndex =- 1 ;
mIndex = SourceTableNames.IndexOf( ' , ' );
while (mIndex > 0 ) {
ExcludedTables.Add(SourceTableNames.Substring( 0 ,mIndex));
SourceTableNames = SourceTableNames.Remove( 0 ,mIndex + 1 );
mIndex = SourceTableNames.IndexOf( ' , ' );
}
ExcludedTables.Add(SourceTableNames);
}
foreach (TableSchema SourceTable in SourceDatabase.Tables)
{
if (SourceTableNames.Length > 0 )
{
if ( ! ExcludedTables.Contains(SourceTable.Name))
continue ;
}
Response.Write( string .Format( " Processing Table {0} ... " , SourceTable.Name));
Response.WriteLine();
try
{
string className = ClearDivideMarkAndPrefix(SourceTable.Name,TableDivideMark,TablePrefix,TablePrefixLength);
for ( int i = 0 ; i < TemplateNames.Length; i ++ )
{
string FileName;
if (i <= 3 )
{
CurrentTemplates[i].SetProperty( " SourceDatabase " , SourceDatabase);
FileName = strFormats[i];
}
else {
CurrentTemplates[i].SetProperty( " SourceTable " , SourceTable);
FileName = string .Format(strFormats[i],className);
}
FileName = Path.Combine(OutputDirectory + OutputPaths[i], FileName);
// 统一属性赋值
CurrentTemplates[i].SetProperty( " NameSpace " ,NameSpace);
CurrentTemplates[i].SetProperty( " Assembly " ,Assembly);
CurrentTemplates[i].SetProperty( " TableDivideMark " ,TableDivideMark);
CurrentTemplates[i].SetProperty( " TablePrefix " ,TablePrefix);
CurrentTemplates[i].SetProperty( " TablePrefixLength " ,TablePrefixLength);
CurrentTemplates[i].SetProperty( " ColumnDivideMark " ,ColumnDivideMark);
CurrentTemplates[i].SetProperty( " ColumnPrefix " ,ColumnPrefix);
CurrentTemplates[i].SetProperty( " ColumnPrefixLength " ,ColumnPrefixLength);
CurrentTemplates[i].SetProperty( " ForceId " ,ForceId);
CurrentTemplates[i].SetProperty( " ForceIdProperty " ,ForceIdProperty);
Response.WriteLine( string .Format( " {0} In {1} " , TemplateNames[i],FileName));
CurrentTemplates[i].RenderToFile(FileName, true );
}
}
catch (Exception ex)
{
Response.WriteLine( " Error: " + ex);
}
}
}
</ script >
<% this .Generate(); %>
<!-- #include file = " Function.inc " -->
<%-- Context --%>
<%-- Object --%>
<% @ Property Name = " NameSpace " Type = " System.String " Default = " NameSpace " Category = " Object " Description = " 项目的命名空间 " %>
<% @ Property Name = " Assembly " Type = " System.String " Default = " Assembly " Category = " Object " Description = " 项目的程序集 " %>
<% @ Property Name = " TableDivideMark " Type = " System.String " Default = " _ " Category = " Object " Description = " 表名分隔符 " %>
<% @ Property Name = " TablePrefix " Type = " System.Boolean " Default = " true " Category = " Object " Description = " 是否有表前缀,如果存在表前缀的,会自动把第一个表名分隔符前的表前缀删除掉。 " %>
<% @ Property Name = " TablePrefixLength " Type = " System.Int32 " Default = " 4 " Category = " Object " Description = " 表前缀长度,如果表前缀大于这个值,则认为没有表前缀 " %>
<% @ Property Name = " ColumnDivideMark " Type = " System.String " Default = " _ " Category = " Object " Description = " 字段名分隔符 " %>
<% @ Property Name = " ColumnPrefix " Type = " System.Boolean " Default = " false " Category = " Object " Description = " 是否有字段前缀,如果存在字段前缀的,会自动把第一个字段名分隔符前的字段前缀删除掉。 " %>
<% @ Property Name = " ColumnPrefixLength " Type = " System.Int32 " Default = " 0 " Category = " Object " Description = " 字段前缀长度,如果字段前缀大于这个值,则认为没有字段前缀 " %>
<% @ Property Name = " ForceId " Type = " System.Boolean " Default = " true " Category = " Object " Description = " 强制性自增量标识主键 " %>
<% @ Property Name = " ForceIdProperty " Type = " System.String " Default = " ID " Category = " Object " Description = " 强制性自增量标识主键的属性名称 " %>
<% @ Property Name = " SourceTableNames " Type = " System.String " Default = "" Category = " Object " Description = " 当指定表名时,只执行字符串中表名列表中的表 " %>
<%-- Context --%>
<% @ Assembly Name = " System.Design " %>
<% @ Assembly Name = " SchemaExplorer " %>
<% @ Import Namespace = " SchemaExplorer " %>
<% @ Import Namespace = " System.IO " %>
<% @ Import Namespace = " System.Xml " %>
<% @ Import Namespace = " System.Text " %>
<% @ Import Namespace = " System.Windows.Forms.Design " %>
<% @ Import Namespace = " System.Text.RegularExpressions " %>
<% @ Import Namespace = " System.Collections.Specialized " %>
< script runat = " template " >
private DatabaseSchema _sourceDatabase;
private string _outputDirectory;
private bool _implementNotification = true ;
// 模板对象列表(根据模板名称产生出来的模板对象)
public CodeTemplate[] CurrentTemplates;
// 模板名称数组
public string [] TemplateNames = { " piggy_projectFileInclue.cst " , " piggy_SqlMap.config.cst " , " piggy_dao.config.cst " , " piggy_service.config.cst " , " piggy_Model_Auto.cst " , " iBatis_sqlmap_Auto.cst " , " piggy_Service.cst " , " piggy_Model.cst " , " piggy_DAL.cst " , " piggy_BLL.cst " , " iBatis_sqlmap.cst " };
// 模板输出格式数组
public string [] strFormats = { " projectFileInclue.txt " , " sqlmap.config " , " Dao_Auto.config " , " Service_Auto.config " , " {0}_Auto.cs " , " {0}_Auto.xml " , " I{0}BLL.cs " , " {0}.cs " , " {0}DAO.cs " , " {0}BLL.cs " , " {0}.xml " };
// 模板输出路径
public string [] OutputPaths = { "" , " \\Data " , " \\Data\\config " , " \\Data\\config " , " \\Data_Auto\\Model " , " \\Data_Auto\\Map " , " \\Data\\service " , " \\Data\\Model " , " \\Data\\DAL " , " \\Data\\BLL " , " \\Data\\Map " };
[Category( " Database " )]
[Description( " Database that the mapping file should be based on. " )]
public DatabaseSchema SourceDatabase {
get { return _sourceDatabase; }
set { _sourceDatabase = value; }
}
[Editor( typeof (System.Windows.Forms.Design.FolderNameEditor), typeof (System.Drawing.Design.UITypeEditor))]
[Category( " Class " )]
[Description( " The folder to save the generated class files. " )]
public string OutputDirectory
{
get { return _outputDirectory;}
set {_outputDirectory = value;}
}
// 根据模板名称产生出来的模板对象列表
public void CreateTemplate()
{
if (CurrentTemplates == null )
{
CurrentTemplates = new CodeTemplate[TemplateNames.Length];
for ( int i = 0 ; i < TemplateNames.Length; i ++ )
{
CurrentTemplates[i] = CompileTemplate(CodeTemplateInfo.DirectoryName + TemplateNames[i]);
}
}
}
// 单独生成一个模板对象
public CodeTemplate CompileTemplate( string templateName)
{
CodeTemplateCompiler compiler = new CodeTemplateCompiler(templateName);
compiler.Compile();
if (compiler.Errors.Count == 0 )
{
return compiler.CreateInstance();
}
else
{
for ( int i = 0 ; i < compiler.Errors.Count; i ++ )
{
Response.WriteLine(compiler.Errors[i].ToString());
}
return null ;
}
}
// 执行输出脚本
public void Generate()
{
if (CurrentTemplates == null )
CreateTemplate();
StringCollection ExcludedTables = new StringCollection();
if (SourceTableNames.Length > 0 )
{
int mIndex =- 1 ;
mIndex = SourceTableNames.IndexOf( ' , ' );
while (mIndex > 0 ) {
ExcludedTables.Add(SourceTableNames.Substring( 0 ,mIndex));
SourceTableNames = SourceTableNames.Remove( 0 ,mIndex + 1 );
mIndex = SourceTableNames.IndexOf( ' , ' );
}
ExcludedTables.Add(SourceTableNames);
}
foreach (TableSchema SourceTable in SourceDatabase.Tables)
{
if (SourceTableNames.Length > 0 )
{
if ( ! ExcludedTables.Contains(SourceTable.Name))
continue ;
}
Response.Write( string .Format( " Processing Table {0} ... " , SourceTable.Name));
Response.WriteLine();
try
{
string className = ClearDivideMarkAndPrefix(SourceTable.Name,TableDivideMark,TablePrefix,TablePrefixLength);
for ( int i = 0 ; i < TemplateNames.Length; i ++ )
{
string FileName;
if (i <= 3 )
{
CurrentTemplates[i].SetProperty( " SourceDatabase " , SourceDatabase);
FileName = strFormats[i];
}
else {
CurrentTemplates[i].SetProperty( " SourceTable " , SourceTable);
FileName = string .Format(strFormats[i],className);
}
FileName = Path.Combine(OutputDirectory + OutputPaths[i], FileName);
// 统一属性赋值
CurrentTemplates[i].SetProperty( " NameSpace " ,NameSpace);
CurrentTemplates[i].SetProperty( " Assembly " ,Assembly);
CurrentTemplates[i].SetProperty( " TableDivideMark " ,TableDivideMark);
CurrentTemplates[i].SetProperty( " TablePrefix " ,TablePrefix);
CurrentTemplates[i].SetProperty( " TablePrefixLength " ,TablePrefixLength);
CurrentTemplates[i].SetProperty( " ColumnDivideMark " ,ColumnDivideMark);
CurrentTemplates[i].SetProperty( " ColumnPrefix " ,ColumnPrefix);
CurrentTemplates[i].SetProperty( " ColumnPrefixLength " ,ColumnPrefixLength);
CurrentTemplates[i].SetProperty( " ForceId " ,ForceId);
CurrentTemplates[i].SetProperty( " ForceIdProperty " ,ForceIdProperty);
Response.WriteLine( string .Format( " {0} In {1} " , TemplateNames[i],FileName));
CurrentTemplates[i].RenderToFile(FileName, true );
}
}
catch (Exception ex)
{
Response.WriteLine( " Error: " + ex);
}
}
}
</ script >
<% this .Generate(); %>
<!-- #include file = " Function.inc " -->
下面是Function.inc文件的部分代码。截取出来的,如果有遗留了哪些代码,请指正:
<
script runat
=
"
template
"
>
private Regex cleanRegEx = new Regex( @" \s+|_|-|\. " , RegexOptions.Compiled);
private Regex cleanID = new Regex( @" (_ID|_id|_Id|\.ID|\.id|\.Id|ID|Id) " , RegexOptions.Compiled);
// 清除字符串中的分隔符以及第一个分隔符前的字符串长度小于等于prefixLength的前缀
public string ClearDivideMarkAndPrefix( string name, string mark, bool prefix, int prefixLength)
{
string strResult = name;
// 处理表前缀
if (prefix)
{
int mIndex = name.IndexOf(mark);
if (mIndex <= prefixLength)
strResult = name.Remove( 0 ,mIndex + mark.Length);
}
if (mark.Length > 0 )
strResult = GetFirstUpStr(strResult,mark);
return strResult;
}
// 受字母大写且mark分隔符后第一个字母大写
public string GetFirstUpStr( string strValue, string mark)
{
string m_Str = strValue.ToLower();
System.Text.StringBuilder mResult = new System.Text.StringBuilder( "" );
int mLen = m_Str.Length;
int j =- 1 ;
j = m_Str.IndexOf(mark);
while (j > 0 )
{
mResult.Append(m_Str.Substring( 0 , 1 ).ToUpper());
mResult.Append(m_Str.Substring( 1 ,j - 1 ));
m_Str = m_Str.Remove( 0 ,j + mark.Length);
j = m_Str.IndexOf(mark);
}
if (m_Str.Length > 0 )
{
mResult.Append(m_Str.Substring( 0 , 1 ).ToUpper());
mResult.Append(m_Str.Substring( 1 ,m_Str.Length - 1 ));
}
return mResult.ToString();
}
</ script >
private Regex cleanRegEx = new Regex( @" \s+|_|-|\. " , RegexOptions.Compiled);
private Regex cleanID = new Regex( @" (_ID|_id|_Id|\.ID|\.id|\.Id|ID|Id) " , RegexOptions.Compiled);
// 清除字符串中的分隔符以及第一个分隔符前的字符串长度小于等于prefixLength的前缀
public string ClearDivideMarkAndPrefix( string name, string mark, bool prefix, int prefixLength)
{
string strResult = name;
// 处理表前缀
if (prefix)
{
int mIndex = name.IndexOf(mark);
if (mIndex <= prefixLength)
strResult = name.Remove( 0 ,mIndex + mark.Length);
}
if (mark.Length > 0 )
strResult = GetFirstUpStr(strResult,mark);
return strResult;
}
// 受字母大写且mark分隔符后第一个字母大写
public string GetFirstUpStr( string strValue, string mark)
{
string m_Str = strValue.ToLower();
System.Text.StringBuilder mResult = new System.Text.StringBuilder( "" );
int mLen = m_Str.Length;
int j =- 1 ;
j = m_Str.IndexOf(mark);
while (j > 0 )
{
mResult.Append(m_Str.Substring( 0 , 1 ).ToUpper());
mResult.Append(m_Str.Substring( 1 ,j - 1 ));
m_Str = m_Str.Remove( 0 ,j + mark.Length);
j = m_Str.IndexOf(mark);
}
if (m_Str.Length > 0 )
{
mResult.Append(m_Str.Substring( 0 , 1 ).ToUpper());
mResult.Append(m_Str.Substring( 1 ,m_Str.Length - 1 ));
}
return mResult.ToString();
}
</ script >
其实,这个批量输出的可以重复使用的,只需要把模板拷贝到对应的模板目录中后,修改变量TemplateNames、strFormats、OutputPaths为自己实际需要的参数就能应用到不同的模板库中了,十分方便,如果看官们的模板参数不一样,那就得修改“//统一属性赋值”下的SetProperty相关的属性就可以了。
原创作品出自努力偷懒,转载请说明文章出处:http://www.cnblogs.com/kfarvid/