CodeSmith基础(三)
2005-12-19 17:49 努力学习的小熊 阅读(23778) 评论(15) 编辑 收藏 举报
这里写的东东都是从CodeSmith自带的帮助文档中FAQ里学到的东东
1.如何在模板中添加注释
CodeSmith:
<%-- Comments --%>
VB.NET:
<%-- 'Comments --%>
C#:
<%-- // Comments --%>
<%-- /* Comments */ --%>
2.创建一个可以下拉选择的属性
首先定义一个枚举类型的变量,然后将属性的类型设置为枚举型
3.解决ASP.NET中标签<%重复问题
先将ASP.NET中使用的这个重复标签写成<%%,避免在生成代码时由于是标签重复引起的编译错误或生成错误。
4.如何声明一个常量
5.如何对模板进行调试
如果要调试一个模板,首先要在代码模板里进行声明,然后在你想要进行调试的地方用Debugger.Break()语句设置断点即可。
6.如何将属性设置成选择一个文件夹的路径
7.怎样调用子模板
SubTemplatesExample.cst文件源代码
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,则表名当前字段为一个标识字段
11.如何使用SchemaExplorer得到存储过程的输入输出参数
使用CodeSmith提供的CommandSchema对象,它包含需要的输入输出参数集合

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

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 %>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)