我想使用一些T4模板来生成从sql server(在本例中)派生的数据库模式的html文件。对于数据库中的每个表,我想创建2个文件:
tableName_List.aspx - 将包含要在asp.net GridView中显示的相应html,并为每个db表列定义的网格列
tableName_Edit.aspx - 将包含在asp.net FormView中显示的相应html,带有文本框(为简单起见,现在)对于每个db表列
所以,如果我在数据库中有5个表,我会得到10个文件输出。我一直在谷歌上搜索并找到相关文章,但大多数似乎都没有解决这个问题。我也看到了使用亚音速的参考,但我宁愿不再引入另一种技术。
答案 0 :(得分:12)
下面的T4模板代码将为您提供一个相对良好的开端。
您需要将对相应版本的Microsoft.SqlSserver Smo DLL的引用添加到项目中。
以下项目需要在此代码中替换为适合您环境的值:
SERVERNAMEGOESHERE
DATABASENAMEGOESHERE
PROJECTNAMESPACEGOESHERE
<#@ 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());
}
}
#>
答案 1 :(得分:10)
以下是一篇文章文章,引导您实现一个代码生成器,为SQL数据库中的每个表生成多个.sql文件:
http://www.olegsych.com/2008/09/t4-tutorial-creating-reusable-code-generation-templates/
http://www.olegsych.com/2008/09/t4-tutorial-creating-complex-code-generators/
完整的教程可以在这里找到:http://t4toolbox.codeplex.com
答案 2 :(得分:3)
本文介绍如何从1个模板创建多个文件:
http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited
您可以通过下载T4CSS并查看来源来查看此方法的示例。
作为替代方案,您可能会发现这种方法对于简单情况更为直接:
http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/