C军

不玩博客了!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、SchemaExplorer获取数据库信息

  在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引用外部资源

 <!-- #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)

  那么就变成了文件选择框,而不是目录选择框。

posted on 2013-04-16 19:04  逆心  阅读(1768)  评论(0编辑  收藏  举报