CodeSmith基础(三)

这里写的东东都是从CodeSmith自带的帮助文档中FAQ里学到的东东
        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.怎样调用子模板
 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
13get
14
15if (_mySubTemplate ==null
16
17         CodeTemplateCompiler compiler =new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName +"MySubTemplate.cst"); 
18         compiler.Compile(); 
19if (compiler.Errors.Count ==0
20
21            _mySubTemplate = compiler.CreateInstance(); 
22         }

23else
24
25for (int i =0; i < compiler.Errors.Count; i++
26{
27               Response.WriteLine(compiler.Errors[ i].ToString()); 
28            }

29         }

30      }

31return _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存储过程
        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
28get
29
30if (_mySubTemplate ==null
31
32         CodeTemplateCompiler compiler =new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName +"MySubTemplate.cst"); 
33         compiler.Compile(); 
34
35if (compiler.Errors.Count ==0
36
37            _mySubTemplate = compiler.CreateInstance(); 
38         }

39else
40
41for (int i =0; i < compiler.Errors.Count; i++
42{
43               Response.WriteLine(compiler.Errors[ i].ToString()); 
44            }

45         }

46      }

47
48return _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文件源代码
 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 {
16string param ="@"+ column.Name +""+ column.NativeType;
17
18switch (column.DataType)
19{
20case DbType.Decimal:
21{
22            param +="("+ column.Precision +""+ column.Scale +")";
23break;
24        }

25default:
26{
27if (column.Size >0)
28{
29                param +="("+ column.Size +")";
30            }

31break;
32        }

33    }

34
35return 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文件源代码
 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 %>http://www.cnblogs.com/Bear-Study-Hard/archive/2005/12/19/300320.html

你可能感兴趣的:(vector,如何)