From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
HotelPms.Share/Data/Script/TableCreator.cs | 127 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 127 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Share/Data/Script/TableCreator.cs b/HotelPms.Share/Data/Script/TableCreator.cs
new file mode 100644
index 0000000..5bb1427
--- /dev/null
+++ b/HotelPms.Share/Data/Script/TableCreator.cs
@@ -0,0 +1,127 @@
+using System.Text;
+
+namespace HotelPms.Share.Data.Script;
+
+public class TableCreator : IDisposable
+{
+ public TableCreator()
+ {
+
+ }
+
+ /// <summary>
+ /// 初期化
+ /// 必ずPKがある
+ /// </summary>
+ /// <param name="name">テーブル名</param>
+ public TableCreator(string name)
+ {
+ Name = name;
+ }
+
+ /// <summary>
+ /// テーブル名
+ /// </summary>
+ public string Name { get; set; } = string.Empty;
+
+ /// <summary>
+ /// テーブルの説明
+ /// </summary>
+ public string Description { get; set; } = string.Empty;
+
+ /// <summary>
+ /// パーティションの構成
+ /// </summary>
+ public string PartitionSchema { get; set; } = string.Empty;
+
+ /// <summary>
+ /// パーティション使用列名
+ /// </summary>
+ public string PartitionKey { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 項目
+ /// </summary>
+ public List<Field> Fields { get; set; } = new List<Field>();
+
+ /// <summary>
+ /// 項目
+ /// </summary>
+ /// <param name="index"></param>
+ /// <returns></returns>
+ public virtual Field this[int index]
+ {
+ get { return Fields[index]; }
+ }
+
+ /// <summary>
+ /// 名称で検索する
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public virtual Field? this[string name]
+ {
+ get { return Fields.FirstOrDefault<Field>(item => item.Name == name); }
+ }
+
+ /// <summary>
+ /// メモリー解放
+ /// </summary>
+ public void Dispose()
+ {
+ Fields.Clear();
+ }
+
+ /// <summary>
+ /// SQL文の作成
+ /// テーブルを削除してから、新規作成する
+ /// </summary>
+ /// <returns></returns>
+ public override string ToString()
+ {
+ StringBuilder desc = new StringBuilder();
+ // テーブルの説明
+ if (Description.Length > 0)
+ {
+ desc.AppendLine($"EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{Description}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{Name}';");
+ }
+
+ StringBuilder cols = new StringBuilder();
+ StringBuilder pk = new StringBuilder();
+ foreach(Field item in Fields)
+ {
+ if (item.IsPrimaryKey)
+ {
+ if(pk.Length > 0) { pk.Append(","); }
+ pk.Append($"[{item.Name}] ASC");
+ }
+
+ cols.AppendLine($"[{item.Name}] {item.DataType} {(item.IsIdentity ? "IDENTITY(1,1)" : string.Empty)} {(item.IsPrimaryKey ? "NOT" : string.Empty)} NULL,");
+
+ if (item.Description.Length > 0)
+ {
+ desc.AppendLine($"EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{item.Description}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{Name}', @level2type=N'COLUMN',@level2name=N'{item.Name}';");
+ }
+ }
+
+ //PARTITION構成の場合、最後にON [PARTITION構成]([列名])
+ string partition = string.Empty;
+ if(PartitionSchema.Length > 0) { partition = $"ON [{PartitionSchema}]([{PartitionKey}])"; }
+ ;
+ return $@"
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'{Name}') AND type in (N'U'))
+DROP TABLE {Name}
+
+CREATE TABLE [{Name}](
+{cols.ToString()}
+ CONSTRAINT [PK_{Name}] PRIMARY KEY CLUSTERED
+(
+ {pk.ToString()}
+)) {partition}
+
+{desc.ToString()}
+";
+ }
+
+
+}
--
Gitblit v1.10.0