クロスT4とSQL

すべてのデータベース開発者(だけでなく)が構成テーブルのデータを更新/追加する必要があったと思います。 T4を使用して、テーブル内の構成データの処理を簡素化した方法を共有したいと思います。

簡単に言えば、この記事では、このSQLスクリプトの仕組みを示したいと思います。



SET IDENTITY_INSERT dbo.Config ON INSERT INTO dbo.Config(ID, ColorId, CategoryId, Name) VALUES(2, 2, 4, N' ') SET IDENTITY_INSERT dbo.Config OFF INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 2, 4) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 1, 1) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 3, 3)
      
      





C#コードに変換します。



 var config = new ConfigTable(); config.Color = "Green"; config.Category = "Bus"; config.Name = " "; config.Id = 2; config.Details.Add("Wheel", 4); config.Details.Add("Engine", 1); config.Details.Add("Door", 3);
      
      







次のテーブルがあると仮定します。







テーブル作成スクリプト
 CREATE TABLE dbo.Color ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(20) NOT NULL ) CREATE TABLE dbo.Category ( ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(20) NOT NULL ) CREATE TABLE dbo.Detail( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, Name NVARCHAR(20) NOT NULL ) CREATE TABLE dbo.Config( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, Name] nvarchar(20) NOT NULL, ColorID int NOT NULL, CategoryID int NOT NULL, ) GO ALTER TABLE dbo.Config WITH CHECK ADD CONSTRAINT FK_Config_Category FOREIGN KEY(CategoryID) REFERENCES dbo.Category(ID) GO ALTER TABLE dbo.Config WITH CHECK ADD CONSTRAINT FK_Config_Color FOREIGN KEY(ColorID) REFERENCES dbo.Color (ID) GO CREATE TABLE dbo.CarDetail( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, ConfigID int NOT NULL, DetailID int NOT NULL, Count int NOT NULL) GO ALTER TABLE dbo.CarDetail WITH CHECK ADD CONSTRAINT FK_CarDetail2Config FOREIGN KEY(ConfigID) REFERENCES dbo.Config (ID) GO ALTER TABLE dbo.CarDetail WITH CHECK ADD CONSTRAINT FK_CarDetail2Detail FOREIGN KEY(DetailID) REFERENCES dbo.Detail (ID)
      
      







ConfigテーブルとCarDetailテーブルの入力と更新の作業を簡素化する方法を説明します。 Color、Category、Detailテーブルのコンテンツがめったに更新されないと仮定します。 それらに次のデータを含めます。





まず、VS 2010/2012を開き、ソリューション 'SqlT4'を作成し、コンソールプロジェクト 'SqlTemplate'を追加し、Tables.csクラスを次の内容で追加します。



 namespace SqlTemplate { public static class ColorTable { static ColorTable() { Dic = new Dictionary<string, int> { {"Red", 1},{"Green", 2},{"Blue", 3},{"Orange", 4} }; } public static Dictionary<string, int> Dic { get; set; } } public static class CategoryTable { static CategoryTable() { Dic = new Dictionary<string, int> { {"Bike", 1},{"Car", 2},{"Truck", 3},{"Bus", 4} }; } public static Dictionary<string, int> Dic { get; set; } } public static class DetailTable { static DetailTable() { Dic = new Dictionary<string, int> { {"Engine", 1},{"Wheel", 2},{"Door", 3} }; } public static Dictionary<string, int> Dic { get; set; } } }
      
      





推測するのは難しくないので、これは色、カテゴリ、詳細テーブルの内容です。

次に、次のコードを使用して、ファイル「Config.cs」を「SqlTemplate」プロジェクトに追加します。



 namespace SqlTemplate { public class ConfigTable { public int Id { get; set; } public string Name { get; set; } public string Color { get; set; } public string Category { get; set; } public int ColorId { get { return ColorTable.Dic[Color]; } } public int CategoryId { get { return CategoryTable.Dic[Category]; } } private Dictionary<string, int> _details = new Dictionary<string, int>(); public Dictionary<string, int> Details { get { return _details; } } public Dictionary<int, int> DetailIdList { get { return Details.ToDictionary(detail => DetailTable.Dic[detail.Key], detail => detail.Value); } } } }
      
      





これらは、構成テーブルのセル値です。

ソリューションをコンパイルし、新しいプロジェクト「SqlT4」を追加します。 「SqlTemplate」プロジェクトにバインドしています。 ファイル 'GreenBus.tt'を追加します-これはT4ファイルです。 彼のコンテンツをこのようにします。



 <#@ output extension=".sql" #> <#@ Assembly name="$(SolutionDir)SqlT4\bin\Debug\SqlTemplate.dll"#> <#@ import namespace="System" #> <#@ import namespace="SqlTemplate" #> <# var config = new ConfigTable(); config.Color = "Green"; config.Category = "Bus"; config.Name = " "; config.Id = 2; config.Details.Add("Wheel", 4); config.Details.Add("Engine", 1); config.Details.Add("Door", 3); #> SET IDENTITY_INSERT dbo.Config ON INSERT INTO dbo.Config(ID, ColorId, CategoryId, Name) VALUES(<#= config.Id #>, <#= config.ColorId #>, <#= config.CategoryId #>, N'<#= config.Name #>') SET IDENTITY_INSERT dbo.Config OFF <#foreach (var dIter in config.DetailIdList){#> INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(<#= config.Id #>, <#= dIter.Key #>, <#= dIter.Value #>) <#}#> --   UPDATE dbo.Config SET Name = N'<#= config.Name #>' , ColorId = <#= config.ColorId #> , CategoryId = <#= config.CategoryId #> WHERE ID = <#= config.Id #>
      
      





ファイルを保存し、出力を取得します。



 SET IDENTITY_INSERT dbo.Config ON INSERT INTO dbo.Config(ID, ColorId, CategoryId, Name) VALUES(2, 2, 4, N' ') SET IDENTITY_INSERT dbo.Config OFF INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 2, 4) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 1, 1) INSERT INTO dbo.CarDetail(ConfigID, DetailID, Count) VALUES(2, 3, 3) --   UPDATE dbo.Config SET Name = N' ' , ColorId = 2 , CategoryId = 4 WHERE ID = 2
      
      





長所:

  1. 時間を節約します(私がどれだけの時間を節約したかを推測するのは難しいですが、確かに人生は単純化されています)
  2. データ作成スクリプトを保存でき、いつでも便利な形式で情報を見ることができます




All Articles