CodeSmith基础(三)

本文介绍了 CodeSmith 的多种实用技巧,包括添加注释、创建可选属性、解决标签重复问题等。此外,还详细讲解了如何调试模板、声明常量、设置文件夹路径属性等内容。

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

 这里写的东东都是从CodeSmith自带的帮助文档中FAQ里学到的东东emsmilep.gif
        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>

        3.解决ASP.NET中标签<%重复问题
        先将ASP.NET中使用的这个重复标签写成<%%,避免在生成代码时由于是标签重复引起的编译错误或生成错误。

        4.如何声明一个常量
       
<script runat="template">
private const string MY_CONST 
= "example"
</script>

        5.如何对模板进行调试
        如果要调试一个模板,首先要在代码模板里进行声明,然后在你想要进行调试的地方用Debugger.Break()语句设置断点即可。
<%@ CodeTemplate Language="C#" TargetLanguage="T-SQL" Description="Debugging your template" Debug="true" %>

<% Debugger.Break(); %>

        6.如何将属性设置成选择一个文件夹的路径
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]

public string OutputDirectory
{
      
get {return _outputDirectory;}
      
set {_outputDirectory= value;}
}

        7.怎样调用子模板
 1None.gif<% 
 2None.gifforeach (TableSchema table in SourceDatabase.Tables) 
 3ExpandedBlockStart.gifContractedBlock.gifdot.gif
 4InBlock.gif   OutputSubTemplate(table); 
 5ExpandedBlockEnd.gif}
 
 6None.gif%>
 7None.gif<script runat="template"> 
 8None.gifprivate CodeTemplate _mySubTemplate;
 9None.gif
10None.gif[Browsable(false)]
11None.gifpublic CodeTemplate MySubTemplate 
12ExpandedBlockStart.gifContractedBlock.gifdot.gif
13InBlock.gif   get 
14ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif
15InBlock.gif      if (_mySubTemplate == null
16ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif
17InBlock.gif         CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "MySubTemplate.cst"); 
18InBlock.gif         compiler.Compile(); 
19InBlock.gif         if (compiler.Errors.Count == 0
20ExpandedSubBlockStart.gifContractedSubBlock.gif         dot.gif
21InBlock.gif            _mySubTemplate = compiler.CreateInstance(); 
22ExpandedSubBlockEnd.gif         }
 
23InBlock.gif         else 
24ExpandedSubBlockStart.gifContractedSubBlock.gif         dot.gif
25InBlock.gif            for (int i = 0; i < compiler.Errors.Count; i++
26ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
27InBlock.gif               Response.WriteLine(compiler.Errors[ i].ToString()); 
28ExpandedSubBlockEnd.gif            }
 
29ExpandedSubBlockEnd.gif         }
 
30ExpandedSubBlockEnd.gif      }
 
31InBlock.gif      return _mySubTemplate; 
32ExpandedSubBlockEnd.gif   }
 
33ExpandedBlockEnd.gif}

34None.gif
35None.gifpublic void OutputSubTemplate(TableSchema table) 
36ExpandedBlockStart.gifContractedBlock.gifdot.gif
37InBlock.gif   MySubTemplate.SetProperty("SourceTable", table); 
38InBlock.gif   MySubTemplate.SetProperty("IncludeDrop"false); 
39InBlock.gif   MySubTemplate.SetProperty("InsertPrefix""Insert"); 
40InBlock.gif   MySubTemplate.Render(Response); 
41ExpandedBlockEnd.gif}
 
42None.gif</script>
        FAQ中给出的例子为生成一个数据库中所有表的更新Update存储过程
        SubTemplatesExample.cst文件源代码
 1None.gif<%@ CodeTemplate Language="C#" TargetLanguage="T-SQL"
 2None.gif    Description="Generates a update stored procedure." %>
 3None.gif
 4None.gif<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema"
 5None.gif    Category="Context"
 6None.gif    Description="Database" %>
 7None.gif
 8None.gif<%@ Assembly Name="SchemaExplorer" %>
 9None.gif
10None.gif<%@ Import Namespace="SchemaExplorer" %>
11None.gif
12None.gif<% 
13None.gifforeach (TableSchema table in SourceDatabase.Tables) 
14ExpandedBlockStart.gifContractedBlock.gifdot.gif
15InBlock.gif   OutputSubTemplate(table); 
16ExpandedBlockEnd.gif}
 
17None.gif%> 
18None.gif
19None.gif<script runat="template"> 
20None.gifprivate CodeTemplate _mySubTemplate; 
21None.gif 
22None.gif
23None.gif  
24None.gif
25None.gif[Browsable(false)]
26None.gifpublic CodeTemplate MySubTemplate 
27ExpandedBlockStart.gifContractedBlock.gifdot.gif
28InBlock.gif   get 
29ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif
30InBlock.gif      if (_mySubTemplate == null
31ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif
32InBlock.gif         CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "MySubTemplate.cst"); 
33InBlock.gif         compiler.Compile(); 
34InBlock.gif         
35InBlock.gif         if (compiler.Errors.Count == 0
36ExpandedSubBlockStart.gifContractedSubBlock.gif         dot.gif
37InBlock.gif            _mySubTemplate = compiler.CreateInstance(); 
38ExpandedSubBlockEnd.gif         }
 
39InBlock.gif         else 
40ExpandedSubBlockStart.gifContractedSubBlock.gif         dot.gif
41InBlock.gif            for (int i = 0; i < compiler.Errors.Count; i++
42ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
43InBlock.gif               Response.WriteLine(compiler.Errors[ i].ToString()); 
44ExpandedSubBlockEnd.gif            }
 
45ExpandedSubBlockEnd.gif         }
 
46ExpandedSubBlockEnd.gif      }
 
47InBlock.gif      
48InBlock.gif      return _mySubTemplate; 
49ExpandedSubBlockEnd.gif   }
 
50ExpandedBlockEnd.gif}
 
51None.gif
52None.gifpublic void OutputSubTemplate(TableSchema table) 
53ExpandedBlockStart.gifContractedBlock.gifdot.gif
54InBlock.gif   MySubTemplate.SetProperty("SourceTable", table); 
55InBlock.gif   MySubTemplate.SetProperty("IncludeDrop"false); 
56InBlock.gif   MySubTemplate.SetProperty("InsertPrefix""Insert"); 
57InBlock.gif   
58InBlock.gif   MySubTemplate.Render(Response); 
59ExpandedBlockEnd.gif}
 
60None.gif</script>
        MySubTemplate.cst文件源代码
 1None.gif<%@ CodeTemplate Language="C#" TargetLanguage="T-SQL"
 2None.gif    Description="Generates a update stored procedure." %>
 3None.gif
 4None.gif<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema"
 5None.gif    Category="Context"
 6None.gif    Description="Table that the stored procedures should be based on." %>
 7None.gif
 8None.gif<%@ Assembly Name="SchemaExplorer" %>
 9None.gif
10None.gif<%@ Import Namespace="SchemaExplorer" %>
11None.gif    
12None.gif    
13None.gif<script runat="template">
14None.gifpublic string GetSqlParameterStatement(ColumnSchema column)
15ExpandedBlockStart.gifContractedBlock.gifdot.gif{
16InBlock.gif    string param = "@" + column.Name + " " + column.NativeType;
17InBlock.gif
18InBlock.gif    switch (column.DataType)
19ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
20InBlock.gif        case DbType.Decimal:
21ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
22InBlock.gif            param += "(" + column.Precision + "" + column.Scale + ")";
23InBlock.gif            break;
24ExpandedSubBlockEnd.gif        }

25InBlock.gif        default:
26ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
27InBlock.gif            if (column.Size > 0)
28ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
29InBlock.gif                param += "(" + column.Size + ")";
30ExpandedSubBlockEnd.gif            }

31InBlock.gif            break;
32ExpandedSubBlockEnd.gif        }

33ExpandedSubBlockEnd.gif    }

34InBlock.gif
35InBlock.gif    return param;
36ExpandedBlockEnd.gif}

37None.gif</script>
38None.gif
39None.gif-----------------------------------------------------------------
40None.gif-- Date Created: <%= DateTime.Now.ToLongDateString() %>
41None.gif-- Created By:   Generated by CodeSmith
42None.gif-----------------------------------------------------------------
43None.gif
44None.gifCREATE PROCEDURE dbo.Update<%= SourceTable.Name %>
45ExpandedBlockStart.gifContractedBlock.gif    <% for (int i = 0; i < SourceTable.Columns.Count; i++dot.gif%>
46ExpandedSubBlockStart.gifContractedSubBlock.gif    <%= GetSqlParameterStatement(SourceTable.Columns[i]) %><% if (i < SourceTable.Columns.Count - 1dot.gif%>,<% } %>
47ExpandedBlockEnd.gif    <% }
 %>
48None.gifAS
49None.gif
50None.gifUPDATE [<%= SourceTable.Name %>] SET
51ExpandedBlockStart.gifContractedBlock.gif    <% for (int i = 0; i < SourceTable.NonPrimaryKeyColumns.Count; i++dot.gif%>
52ExpandedSubBlockStart.gifContractedSubBlock.gif    [<%= SourceTable.NonPrimaryKeyColumns[i].Name %>= @<%= SourceTable.NonPrimaryKeyColumns[i].Name %><% if (i < SourceTable.NonPrimaryKeyColumns.Count - 1dot.gif%>,<% } %>
53ExpandedBlockEnd.gif    <% }
 %>
54None.gifWHERE
55ExpandedBlockStart.gifContractedBlock.gif    <% for (int i = 0; i < SourceTable.PrimaryKey.MemberColumns.Count; i++dot.gif%>
56ExpandedSubBlockStart.gifContractedSubBlock.gif    <% if (i > 0dot.gif%>AND <% } %>
57InBlock.gif    [<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>= @<%= SourceTable.PrimaryKey.MemberColumns[i].Name %>
58ExpandedBlockEnd.gif    <% }
 %>

        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文件源代码
 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                  %>

        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 %>

        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文件源代码
 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 %>

转载于:https://www.cnblogs.com/jirong/archive/2006/04/13/374404.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值