Шаблон T4 для создания * нескольких * html (например) выходных файлов на таблицу из схемы базы данных - PullRequest
10 голосов
/ 08 февраля 2010

Я хотел бы использовать некоторые шаблоны T4 для генерации html-файлов, полученных из схемы базы данных sql-сервера (в данном случае). Для каждой таблицы в базе данных я хотел бы создать 2 файла:

  1. tableName_List.aspx - будет содержать соответствующий html для отображения в GridView asp.net, со столбцом сетки, определенным для каждого столбца таблицы БД

  2. tableName_Edit.aspx - будет содержать соответствующий HTML-код для отображения в asp.net FormView, с текстовым полем (для простоты, на данный момент) для каждого столбца таблицы БД

Итак, если у меня есть 5 таблиц в базе данных, я получу 10 файлов. Я гуглил это и нашел похожие статьи, но большинство из них, похоже, не рассматривают этот сценарий. Я также видел ссылки на использование для этой цели дозвуковых эффектов, но я бы предпочел не вводить в процесс еще одну технологию.

Ответы [ 3 ]

12 голосов
/ 18 июня 2010

Код для шаблона T4, приведенного ниже, даст вам относительно хорошее начало.

Вам потребуется добавить в проект ссылки на соответствующие версии DLL-библиотек Microsoft.SqlSserver Smo.

Следующие элементы необходимо заменить в этом коде соответствующими значениями для вашей среды:

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());
    }
}
#>
10 голосов
/ 18 февраля 2010

Вот краткие статьи, в которых рассказывается о реализации генератора кода, который создает несколько файлов .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

3 голосов
/ 09 февраля 2010

В этой статье описывается, как создать несколько файлов из одного шаблона:

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/

...