• CodeSmith之四 典型实例(四)


    一、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)

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

  • 相关阅读:
    Oracle: 一个很让人纠结的sql问题,给自己长个记性
    TextInfo list of CultureInfo
    一个简单的面试题称粮食
    C++ 中什么是内联函数(zhuan)
    C/C++ 到 shellcode 过程
    常量指针与指针常量的区别(转帖)
    分清函数指针和指针函数
    如何编写自己的缓冲区溢出利用程序? (zz)
    动态获取API函数地址对抗win7 aslr安全机制(转)
    暴力搜索内存空间获得 Api 的线性地址
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3024529.html
Copyright © 2020-2023  润新知