1.如何在模板中添加注释
CodeSmith:
<%-- Comments --%>
VB.NET:
<%-- 'Comments --%>
C#:
<%-- // Comments --%>
<%-- /* Comments */ --%>
2.创建一个可以下拉选择的属性
首先定义一个枚举类型的变量,然后将属性的类型设置为枚举型
1
<%
@ Property Name
=
"
CollectionType
"
Type
=
"
CollectionTypeEnum
"
Category
=
"
Collection
"
Description
=
"
Type of collection
"
%>
2
3 < script runat = " tempate " >
4 public enum CollectionTypeEnum
5 {
6 Vector,
7 HashTable,
8 SortedList
9 }
10 script >
2
3 < script runat = " tempate " >
4 public enum CollectionTypeEnum
5 {
6 Vector,
7 HashTable,
8 SortedList
9 }
10 script >
3.解决ASP.NET中标签<%重复问题
先将ASP.NET中使用的这个重复标签写成<%%,避免在生成代码时由于是标签重复引起的编译错误或生成错误。
4.如何声明一个常量
<
script runat
=
"
template
"
>
private const string MY_CONST = " example " ;
script >
private const string MY_CONST = " example " ;
script >
5.如何对模板进行调试
如果要调试一个模板,首先要在代码模板里进行声明,然后在你想要进行调试的地方用Debugger.Break()语句设置断点即可。
<%
@ CodeTemplate Language
=
"
C#
"
TargetLanguage
=
"
T-SQL
"
Description
=
"
Debugging your template
"
Debug
=
"
true
"
%>
<% Debugger.Break(); %>
<% Debugger.Break(); %>
6.如何将属性设置成选择一个文件夹的路径
[Editor(
typeof
(System.Windows.Forms.Design.FolderNameEditor),
typeof
(System.Drawing.Design.UITypeEditor))]
public string OutputDirectory
{
get { return _outputDirectory;}
set {_outputDirectory = value;}
}
public string OutputDirectory
{
get { return _outputDirectory;}
set {_outputDirectory = value;}
}
7.怎样调用子模板
1
<%
2 foreach (TableSchema table in SourceDatabase.Tables)
3 {
4 OutputSubTemplate(table);
5}
6 %>
7 < script runat = " template " >
8 private CodeTemplate _mySubTemplate;
9
10 [Browsable( false )]
11 public CodeTemplate MySubTemplate
12 {
13 get
14 {
15 if (_mySubTemplate == null)
16 {
17 CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "MySubTemplate.cst");
18 compiler.Compile();
19 if (compiler.Errors.Count == 0)
20 {
21 _mySubTemplate = compiler.CreateInstance();
22 }
23 else
24 {
25 for (int i = 0; i < compiler.Errors.Count; i++)
26 {
27 Response.WriteLine(compiler.Errors[ i].ToString());
28 }
29 }
30 }
31 return _mySubTemplate;
32 }
33}
34
35 public void OutputSubTemplate(TableSchema table)
36 {
37 MySubTemplate.SetProperty("SourceTable", table);
38 MySubTemplate.SetProperty("IncludeDrop", false);
39 MySubTemplate.SetProperty("InsertPrefix", "Insert");
40 MySubTemplate.Render(Response);
41}
42 script >
FAQ中给出的例子为生成一个数据库中所有表的更新Update存储过程
2 foreach (TableSchema table in SourceDatabase.Tables)
3 {
4 OutputSubTemplate(table);
5}
6 %>
7 < script runat = " template " >
8 private CodeTemplate _mySubTemplate;
9
10 [Browsable( false )]
11 public CodeTemplate MySubTemplate
12 {
13 get
14 {
15 if (_mySubTemplate == null)
16 {
17 CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "MySubTemplate.cst");
18 compiler.Compile();
19 if (compiler.Errors.Count == 0)
20 {
21 _mySubTemplate = compiler.CreateInstance();
22 }
23 else
24 {
25 for (int i = 0; i < compiler.Errors.Count; i++)
26 {
27 Response.WriteLine(compiler.Errors[ i].ToString());
28 }
29 }
30 }
31 return _mySubTemplate;
32 }
33}
34
35 public void OutputSubTemplate(TableSchema table)
36 {
37 MySubTemplate.SetProperty("SourceTable", table);
38 MySubTemplate.SetProperty("IncludeDrop", false);
39 MySubTemplate.SetProperty("InsertPrefix", "Insert");
40 MySubTemplate.Render(Response);
41}
42 script >
SubTemplatesExample.cst文件源代码
1
<%
@ CodeTemplate Language
=
"
C#
"
TargetLanguage
=
"
T-SQL
"
2 Description = " Generates a update stored procedure. " %>
3
4 <% @ Property Name = " SourceDatabase " Type = " SchemaExplorer.DatabaseSchema "
5 Category = " Context "
6 Description = " Database " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12 <%
13 foreach (TableSchema table in SourceDatabase.Tables)
14 {
15 OutputSubTemplate(table);
16}
17 %>
18
19 < script runat = " template " >
20 private CodeTemplate _mySubTemplate;
21
22
23
24
25 [Browsable( false )]
26 public CodeTemplate MySubTemplate
27 {
28 get
29 {
30 if (_mySubTemplate == null)
31 {
32 CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "MySubTemplate.cst");
33 compiler.Compile();
34
35 if (compiler.Errors.Count == 0)
36 {
37 _mySubTemplate = compiler.CreateInstance();
38 }
39 else
40 {
41 for (int i = 0; i < compiler.Errors.Count; i++)
42 {
43 Response.WriteLine(compiler.Errors[ i].ToString());
44 }
45 }
46 }
47
48 return _mySubTemplate;
49 }
50}
51
52 public void OutputSubTemplate(TableSchema table)
53 {
54 MySubTemplate.SetProperty("SourceTable", table);
55 MySubTemplate.SetProperty("IncludeDrop", false);
56 MySubTemplate.SetProperty("InsertPrefix", "Insert");
57
58 MySubTemplate.Render(Response);
59}
60 script >
MySubTemplate.cst文件源代码
2 Description = " Generates a update stored procedure. " %>
3
4 <% @ Property Name = " SourceDatabase " Type = " SchemaExplorer.DatabaseSchema "
5 Category = " Context "
6 Description = " Database " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12 <%
13 foreach (TableSchema table in SourceDatabase.Tables)
14 {
15 OutputSubTemplate(table);
16}
17 %>
18
19 < script runat = " template " >
20 private CodeTemplate _mySubTemplate;
21
22
23
24
25 [Browsable( false )]
26 public CodeTemplate MySubTemplate
27 {
28 get
29 {
30 if (_mySubTemplate == null)
31 {
32 CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "MySubTemplate.cst");
33 compiler.Compile();
34
35 if (compiler.Errors.Count == 0)
36 {
37 _mySubTemplate = compiler.CreateInstance();
38 }
39 else
40 {
41 for (int i = 0; i < compiler.Errors.Count; i++)
42 {
43 Response.WriteLine(compiler.Errors[ i].ToString());
44 }
45 }
46 }
47
48 return _mySubTemplate;
49 }
50}
51
52 public void OutputSubTemplate(TableSchema table)
53 {
54 MySubTemplate.SetProperty("SourceTable", table);
55 MySubTemplate.SetProperty("IncludeDrop", false);
56 MySubTemplate.SetProperty("InsertPrefix", "Insert");
57
58 MySubTemplate.Render(Response);
59}
60 script >
1
<%
@ CodeTemplate Language
=
"
C#
"
TargetLanguage
=
"
T-SQL
"
2 Description = " Generates a update stored procedure. " %>
3
4 <% @ Property Name = " SourceTable " Type = " SchemaExplorer.TableSchema "
5 Category = " Context "
6 Description = " Table that the stored procedures should be based on. " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12
13 < script runat = " template " >
14 public string GetSqlParameterStatement(ColumnSchema column)
15 {
16 string param = "@" + column.Name + " " + column.NativeType;
17
18 switch (column.DataType)
19 {
20 case DbType.Decimal:
21 {
22 param += "(" + column.Precision + ", " + column.Scale + ")";
23 break;
24 }
25 default:
26 {
27 if (column.Size > 0)
28 {
29 param += "(" + column.Size + ")";
30 }
31 break;
32 }
33 }
34
35 return param;
36}
37 script >
38
39 -----------------------------------------------------------------
40 -- Date Created: <%= DateTime.Now.ToLongDateString() %>
41 -- Created By: Generated by CodeSmith
42 -----------------------------------------------------------------
43
44 CREATE PROCEDURE dbo.Update <%= SourceTable.Name %>
45 <% for ( int i = 0 ; i < SourceTable.Columns.Count; i ++ ) { %>
46 <%= GetSqlParameterStatement(SourceTable.Columns[i]) %><% if (i < SourceTable.Columns.Count - 1) { %>,<% } %>
47 <% } %>
48 AS
49
50 UPDATE [ <%= SourceTable.Name %> ] SET
51 <% for ( int i = 0 ; i < SourceTable.NonPrimaryKeyColumns.Count; i ++ ) { %>
52 [<%= SourceTable.NonPrimaryKeyColumns[i].Name %>] = @<%= SourceTable.NonPrimaryKeyColumns[i].Name %><% if (i < SourceTable.NonPrimaryKeyColumns.Count - 1) { %>,<% } %>
53 <% } %>
54 WHERE
55 <% for ( int i = 0 ; i < SourceTable.PrimaryKey.MemberColumns.Count; i ++ ) { %>
56 <% if (i > 0) { %>AND <% } %>
57 [<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>] = @<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>
58 <% } %>
2 Description = " Generates a update stored procedure. " %>
3
4 <% @ Property Name = " SourceTable " Type = " SchemaExplorer.TableSchema "
5 Category = " Context "
6 Description = " Table that the stored procedures should be based on. " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12
13 < script runat = " template " >
14 public string GetSqlParameterStatement(ColumnSchema column)
15 {
16 string param = "@" + column.Name + " " + column.NativeType;
17
18 switch (column.DataType)
19 {
20 case DbType.Decimal:
21 {
22 param += "(" + column.Precision + ", " + column.Scale + ")";
23 break;
24 }
25 default:
26 {
27 if (column.Size > 0)
28 {
29 param += "(" + column.Size + ")";
30 }
31 break;
32 }
33 }
34
35 return param;
36}
37 script >
38
39 -----------------------------------------------------------------
40 -- Date Created: <%= DateTime.Now.ToLongDateString() %>
41 -- Created By: Generated by CodeSmith
42 -----------------------------------------------------------------
43
44 CREATE PROCEDURE dbo.Update <%= SourceTable.Name %>
45 <% for ( int i = 0 ; i < SourceTable.Columns.Count; i ++ ) { %>
46 <%= GetSqlParameterStatement(SourceTable.Columns[i]) %><% if (i < SourceTable.Columns.Count - 1) { %>,<% } %>
47 <% } %>
48 AS
49
50 UPDATE [ <%= SourceTable.Name %> ] SET
51 <% for ( int i = 0 ; i < SourceTable.NonPrimaryKeyColumns.Count; i ++ ) { %>
52 [<%= SourceTable.NonPrimaryKeyColumns[i].Name %>] = @<%= SourceTable.NonPrimaryKeyColumns[i].Name %><% if (i < SourceTable.NonPrimaryKeyColumns.Count - 1) { %>,<% } %>
53 <% } %>
54 WHERE
55 <% for ( int i = 0 ; i < SourceTable.PrimaryKey.MemberColumns.Count; i ++ ) { %>
56 <% if (i > 0) { %>AND <% } %>
57 [<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>] = @<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>
58 <% } %>
8.在加载模板时默认加载的命名空间Namespaces和组件Assemblies
组件:mscorlib, System, System.Xml, System.Data, System.Drawing, Microsoft.VisualBasic, System.Windows.Forms, CodeSmith.Engine
命名空间:System, System.Data, System.Diagnostics, System.ComponentModel, Microsoft.VisualBasic, CodeSmith.Engine
9.使用SchemaExplorer能否确定一个字段(Field)是标识字段(主键,Identity Field)
在字段的扩展属性集合中包含一个叫“CS_IsIdentity”的属性,如果这个属性的值为true,则表名当前字段为一个标识字段
1
Identity Field
=
<%
foreach
(ColumnSchema cs
in
SourceTable.Columns) {
2 if ( (( bool )cs.ExtendedProperties[ " CS_IsIdentity " ].Value) == true )
3 {
4 Response.Write(cs.Name);
5 }
6 }
7 %>
CS_Identity_Example.cst文件源代码2 if ( (( bool )cs.ExtendedProperties[ " CS_IsIdentity " ].Value) == true )
3 {
4 Response.Write(cs.Name);
5 }
6 }
7 %>
1
<%
@ CodeTemplate Language
=
"
C#
"
TargetLanguage
=
"
T-SQL
"
2 Description = " Identifies the identity field of a table " %>
3
4 <% @ Property Name = " SourceTable " Type = " SchemaExplorer.TableSchema "
5 Category = " Context "
6 Description = " Table to target. " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12
13
14 Identity Field = <% foreach (ColumnSchema cs in SourceTable.Columns) {
15 if ( (( bool )cs.ExtendedProperties[ " CS_IsIdentity " ].Value) == true )
16 {
17 Response.Write(cs.Name);
18 }
19 }
20 %>
2 Description = " Identifies the identity field of a table " %>
3
4 <% @ Property Name = " SourceTable " Type = " SchemaExplorer.TableSchema "
5 Category = " Context "
6 Description = " Table to target. " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12
13
14 Identity Field = <% foreach (ColumnSchema cs in SourceTable.Columns) {
15 if ( (( bool )cs.ExtendedProperties[ " CS_IsIdentity " ].Value) == true )
16 {
17 Response.Write(cs.Name);
18 }
19 }
20 %>
10.如何确定一个字段的默认值(各人认为翻译成如何知道一个字段有默认值并且默认值是什么)
在字段的扩展属性集合中包含一个叫“CS_Default”的属性
1
<%
2 foreach (ColumnSchema cs in SourceTable.Columns) {
3 if (cs.ExtendedProperties[ " CS_Default " ] != null )
4 {
5 Response.WriteLine(cs.ExtendedProperties[ " CS_Default " ].Value);
6 }
7 }
8 %>
2 foreach (ColumnSchema cs in SourceTable.Columns) {
3 if (cs.ExtendedProperties[ " CS_Default " ] != null )
4 {
5 Response.WriteLine(cs.ExtendedProperties[ " CS_Default " ].Value);
6 }
7 }
8 %>
11.如何使用SchemaExplorer得到存储过程的输入输出参数
使用CodeSmith提供的CommandSchema对象,它包含需要的输入输出参数集合
1
Input Parameters:
2 <% foreach (ParameterSchema ps in SourceProcedure.AllInputParameters)
3 {
4 Response.Write(ps.Name);
5 Response.Write( " \n " );
6 }
7 %>
8
9
10 Output Parameters:
11 <% foreach (ParameterSchema ps in SourceProcedure.AllOutputParameters)
12 {
13 Response.Write(ps.Name);
14 Response.Write( " \n " );
15 }
16 %>
InputOutputParameterExample.cst文件源代码
2 <% foreach (ParameterSchema ps in SourceProcedure.AllInputParameters)
3 {
4 Response.Write(ps.Name);
5 Response.Write( " \n " );
6 }
7 %>
8
9
10 Output Parameters:
11 <% foreach (ParameterSchema ps in SourceProcedure.AllOutputParameters)
12 {
13 Response.Write(ps.Name);
14 Response.Write( " \n " );
15 }
16 %>
1
<%
@ CodeTemplate Language
=
"
C#
"
TargetLanguage
=
"
T-SQL
"
2 Description = " Generates a update stored procedure. " %>
3
4 <% @ Property Name = " SourceProcedure " Type = " SchemaExplorer.CommandSchema "
5 Category = " Context "
6 Description = " The stored procedure to examine " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12 Input Parameters:
13 <% foreach (ParameterSchema ps in SourceProcedure.AllInputParameters)
14 {
15 Response.Write(ps.Name);
16 Response.Write( " \n " );
17 }
18 %>
19
20
21 Output Parameters:
22 <% foreach (ParameterSchema ps in SourceProcedure.AllOutputParameters)
23 {
24 Response.Write(ps.Name);
25 Response.Write( " \n " );
26 }
27 %>
2 Description = " Generates a update stored procedure. " %>
3
4 <% @ Property Name = " SourceProcedure " Type = " SchemaExplorer.CommandSchema "
5 Category = " Context "
6 Description = " The stored procedure to examine " %>
7
8 <% @ Assembly Name = " SchemaExplorer " %>
9
10 <% @ Import Namespace = " SchemaExplorer " %>
11
12 Input Parameters:
13 <% foreach (ParameterSchema ps in SourceProcedure.AllInputParameters)
14 {
15 Response.Write(ps.Name);
16 Response.Write( " \n " );
17 }
18 %>
19
20
21 Output Parameters:
22 <% foreach (ParameterSchema ps in SourceProcedure.AllOutputParameters)
23 {
24 Response.Write(ps.Name);
25 Response.Write( " \n " );
26 }
27 %>