在CodeSmith中,读取数据库信息是通过SchemaExplorer对象。
更多数据库方面的信息,可以在第三篇中找到,下面来看一个通过输入一个数据库,输出数据库信息的实例:
首先,建一个数据库,新建如下表:
模板代码:
<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %> <%--Type数据类型为SchemaExplorer.Databasechema,表明参数SourceDatabase是一个数据库对象。--%> <%@ Property Name="SourceDataBase" Type="SchemaExplorer.DatabaseSchema" Category="数据库" Description="获取数据库信息" %> <%--引入数据库操作组件--%> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="SchemaExplorer" %> 数据库名称:<%= SourceDataBase.Name %> <%--获取数据库下的所有表--%> <% foreach(TableSchema table in SourceDataBase.Tables) %> <% { %> 表:<%= table.Name %>下的列: <% foreach(ColumnSchema column in table.Columns) %> <% { %> 列名:<%= column.Name %>; 类型:<%= column.DataType %>; 说明:<%= column.Description %> <% } %> 外键: <% if(table.ForeignKeyColumns != null) %> <% { %> 外键列名: <% foreach(var r in table.ForeignKeyColumns) %> <% { %> <%= r.Name %> <% } %> <% } %> <% } %>
以上代码输出结果如下:
代码说明:
<%@ Assembly Name="组件名"%>:引用组件,等同于程序中的添加引用
<%@ Import Namespace="组件名"%>:导入组件,等同于程序中的using
注意:如果不知道怎么选择数据库(即输入数据库这个参数),可以本系列查看第一篇。
<!-- #include file="NewTemplate2.cst" --> 引入外部文件。
引入了外部文件后,就能够调用外部文件的变量、常量、方法等。
示例,假设我们有两个cst文件:NewTemplate1.cst,NewTemplate2.cst。
NewTemplate2.cst:
<%@ Template Language="C#" TargetLanguage="Text" %> <script runat="template"> public int GetMax(int a,int b) { return a > b ? a:b; } </script>
NewTemplate1.cst:
<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %> <!-- #include file="NewTemplate2.cst" --> <%= GetMax(5,8) %>
以上代码输出8。
注意要记住引用下面这两个文件:
<%@ Assembly Name="CodeSmith.BaseTemplates" %>
<%@ Import Namespace="CodeSmith.BaseTemplates" %>
NewTemplate1.cst:
<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %> <%@ Register Name="MyEntityClass" Template="D:\代码\NewTemplate2.cst" MergeProperties="False" ExcludeProperties="" %> <%@ Assembly Name="CodeSmith.BaseTemplates" %> <%@ Import Namespace="CodeSmith.BaseTemplates" %> <% CodeTemplate temp = new MyEntityClass(); %> <% temp.RenderToFile(@"D:\代码\生成路径.txt", true); %>
NewTemplate2.cst:
<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %> 打算把我生成到哪里?
点击生成NewTemplate1.cst之后,目录"D:\代码\",会出现一个"生成路径.txt"的文件,正是我们希望生成的文件。
RenderToFile(),第一个参数是生成路径,第二个参数是否覆盖原有文件。
另外,假若要调用生成的文件,如上面的NewTemplate2.cst文件是有属性的,只需要
<% temp.SetProperty("pro",123); %>
就能够轻松设置属性值。
当我们需要的参数是计算机本地的一个有效路径时,这是将参数设置为路径让用户选择就最好不过了。
实现代码如下:
<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %> <script runat="template"> private string _outputDirectory; [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))] public string OutputDirectory { get {return _outputDirectory;} set {_outputDirectory= value;} } </script> <%= OutputDirectory %>
不再截取图片。总之,在输入参数的时候,点击右边的...就会打开文件选择。
对于以上代码,淡黄色背景那行才是重点,实际上如果去掉那行,一样要输入属性,只是输入时会变成普通字符串,不能再打开文件选择框。这是一个反射,从中可以看到Editor接受的是两个Type类的对象作为参数。如果我们将第一个参数改为
typeof(System.Windows.Forms.Design.FileNameEditor)
那么就变成了文件选择框,而不是目录选择框。