2010-02-08 10 views
10

Chciałbym użyć niektórych szablonów T4 do generowania plików html pochodzących z serwera sql (w tym przypadku) schematu bazy danych. Dla każdej tabeliw bazie danych, chciałbym utworzyć 2 pliki:Szablon T4 do tworzenia * wielu * html (na przykład) plików wyjściowych na tabelę ze schematu bazy danych

  1. tableName_List.aspx - będzie zawierać odpowiedni kod HTML do wyświetlania w GridView ASP.NET, z kolumną siatki zdefiniowane dla każdego tabela dB kolumna

  2. tableName_Edit.aspx - będzie zawierać odpowiednią html do wyświetlenia w FormView asp.net z pola tekstowego (dla uproszczenia, na razie) dla każdej kolumny tabeli dB

Tak więc, jeśli mam 5 tabel w bazie danych, otrzymam 10 plików wyjściowych. Przeszukałem to i znalazłem powiązane artykuły, ale większość z nich nie odnosi się do tego scenariusza. Widziałem także odniesienia do używania poddźwiękowych w tym celu, ale wolę nie wprowadzać do tej technologii jeszcze jednej.

Odpowiedz

12

Kod dla poniższego szablonu T4 zapewni stosunkowo dobry start.

Będziesz musiał dodać odniesienia do odpowiednich wersji bibliotek DLL Microsoft.SqlSserver do projektu.

Następujące elementy muszą być wymienione w tym kodzie z odpowiednimi wartościami dla środowiska:

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()); 
    } 
} 
#> 
+0

Bardzo ładne! Dwa pytania: 1. w tableName_Edit.aspx w jaki sposób można wykryć klucz obcy i utworzyć DropDownList zamiast BoundColumn? 2. Czy można to zrobić za pomocą Oracle? – tbone

+0

@ tbone: 1. oneColumn.IsForeignKey 2. Wierzę, że SMO jest tylko serwerem MS SQL Server, ale możesz uzyskać dane meta z dowolnej bazy danych za pomocą API i/lub SQL bazy danych dostawcy bazy danych –

+0

, która bardzo mi pomogła, dzięki za wspaniałą odpowiedź –

3

W tym artykule opisano, jak utworzyć wiele plików z 1 szablonu:

http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited

można zobaczyć próbkę tego podejścia pobierając T4CSS i sprawdzeniu źródła.

Jako alternatywę można znaleźć to podejście bardziej proste dla prostych przypadkach:

http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/

+1

olegsych blog jest zlikwidowany, a nowy (poprzez github , http://olegsych.com/T4Toolbox/getting-started.html) brakuje wielu starych treści. Stare rzeczy znajdują się na komputerze zwrotnym, na przykład: https://web.archive.org/web/20160409042105/http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs- from-single-t4-template/ –

10

Oto turorial artykuły, które Cię przez wdrożenie generator kodu, który produkuje wiele plików .sql dla każdej tabeli w bazie danych 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/

Kompletny samouczek można znaleźć tutaj: http://t4toolbox.codeplex.com

+0

o człowieku, nie mogę ci wystarczająco podziękować za artykuły, które umieściłeś na swojej stronie w sprawie T4.tak smutne, że mogę przegłosować tylko raz :( – TheVillageIdiot

Powiązane problemy