代码之家  ›  专栏  ›  技术社区  ›  tbone

T4模板,用于从数据库模式为每个表创建*多个*html(例如)输出文件

t4
  •  10
  • tbone  · 技术社区  · 14 年前

    1. tableName_List.aspx-将包含要在asp.net GridView中显示的适当html,并定义一个网格列 对于每个db表列

    2. tableName_Edit.aspx-将包含适当的html以显示在asp.net FormView中,并带有一个文本框(为了简单起见,现在) 对于每个db表列

    因此,如果数据库中有5个表,我将得到10个文件输出。我在谷歌上搜索了这篇文章,找到了相关的文章,但大多数文章似乎都没有提到这种情况。我也看到过使用亚音速的参考资料,但我不想在混合中引入另一种技术。

    3 回复  |  直到 14 年前
        1
  •  12
  •   Michael Maddox    14 年前

    您需要将对Microsoft.SqlSserver Smo DLL的适当版本的引用添加到项目中。

    此代码中的以下项目需要替换为适合您环境的适当值:


    戈谢尔数据库
    ProjectNamespaceGoesher

    <#@ template language="C#v3.5" hostspecific="true" #>
    <#@ assembly name="System.Data" #>
    <#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
    <#@ assembly name="Microsoft.SqlServer.Smo" #>
    <#@ import namespace="System.Data.SqlClient" #>
    <#@ import namespace="Microsoft.SqlServer.Management.Common" #>
    <#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
    <#
        string connectionString = @"Server=SERVERNAMEGOESHERE;Trusted_Connection=True;";
        string databaseName = "DATABASENAMEGOESHERE";
        string projectNamespace = "PROJECTNAMESPACEGOESHERE";
        string relativeOutputFilePath = null;
    
        SqlConnection oneSqlConnection = new SqlConnection(connectionString);
        ServerConnection oneServerConnection = new ServerConnection(oneSqlConnection);
        Server oneServer = new Server(oneServerConnection);
        Database oneDatabase = oneServer.Databases[databaseName];
        foreach (Table oneTable in oneDatabase.Tables)
        {
            if (!oneTable.Name.Equals("sysdiagrams"))
            {
    #>
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="<#= oneTable.Name #>_List.aspx.cs" Inherits="<#= projectNamespace #>.<#= oneTable.Name #>_List" %>
    <asp:DataGrid ID="<#= oneTable.Name #>DataGrid" runat="server" AutoGenerateColumns="false">
        <Columns>
    <#
                foreach (Column oneColumn in oneTable.Columns)
                {
    #>
            <asp:BoundColumn DataField="<#= oneColumn.Name #>" HeaderText="<#= oneColumn.Name #>"></asp:BoundColumn>
    <#
                }
    #>
        </Columns>
    </asp:DataGrid>
    <#
                relativeOutputFilePath = @"\Output\" + oneTable.Name + "_List.aspx";
                TemplateHelper.WriteTemplateOutputToFile(relativeOutputFilePath, Host, GenerationEnvironment);
                GenerationEnvironment = new System.Text.StringBuilder();
    #>
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="<#= oneTable.Name #>_Edit.aspx.cs" Inherits="<#= projectNamespace #>.<#= oneTable.Name #>_Edit" %>
    <#
                foreach (Column oneColumn in oneTable.Columns)
                {
    #>
        <asp:TextBox ID="<#= oneColumn.Name #>TextBox" runat="server" />
    <#
                }
                relativeOutputFilePath = @"\Output\" + oneTable.Name + "_Edit.aspx";
                TemplateHelper.WriteTemplateOutputToFile(relativeOutputFilePath, Host, GenerationEnvironment);
                GenerationEnvironment = new System.Text.StringBuilder();
            }
        }
    #>
    <#+
    public class TemplateHelper
    {
        public static void WriteTemplateOutputToFile(
            string relativeOutputFilePath,
            Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost Host,
            System.Text.StringBuilder GenerationEnvironment)
        {
            string outputPath = System.IO.Path.GetDirectoryName(Host.TemplateFile);
            string outputFilePath = outputPath + relativeOutputFilePath;
            System.IO.File.WriteAllText(outputFilePath, GenerationEnvironment.ToString());
        }
    }
    #>
    
        2
  •  10
  •   Oleg Sych    14 年前