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.SourceFactory/Table/SqlFactory.cs | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 207 insertions(+), 0 deletions(-)
diff --git a/HotelPms.SourceFactory/Table/SqlFactory.cs b/HotelPms.SourceFactory/Table/SqlFactory.cs
new file mode 100644
index 0000000..0d0ae6d
--- /dev/null
+++ b/HotelPms.SourceFactory/Table/SqlFactory.cs
@@ -0,0 +1,207 @@
+using HotelPms.Share.Data;
+using HotelPms.Share.Data.Script;
+using HotelPms.Share.IO;
+using HotelPms.Share.Windows.Util;
+using System.Reflection;
+using System.Text;
+
+namespace HotelPms.SourceFactory.Table
+{
+ /// <summary>
+ /// Excelのテーブル定義書より、
+ /// SqlScriptを作成する
+ /// </summary>
+ public class SqlFactory : IDisposable
+ {
+ public DBConnectItem? DBSetting { get; set; }
+ public string ExcelFile { get; set; } = string.Empty;
+
+ public void Dispose()
+ {
+
+ }
+
+ public bool CreateByExcel(string file, DBConnectItem dbSetting)
+ {
+ try
+ {
+ ExcelFile = file;
+ DBSetting = dbSetting;
+ using (NPOIExcel excel = new NPOIExcel(file))
+ {
+ for (int i = 0; i < excel.Workbook.NumberOfSheets; i++)
+ {
+ excel.SetCurrentSheet(i);
+ if (!IsTableSheet(excel)) { continue; }
+ CreateBySheet(excel);
+ }
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ OperationLog.Instance.WriteLog($"{MethodInfo.GetCurrentMethod()}:{ex.Message}");
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 対象シートはテーブル定義のシートかどうか
+ /// B4 = "テーブル名" ⇒ TABLE = G4
+ /// </summary>
+ /// <param name="sheet"></param>
+ /// <returns></returns>
+ private bool IsTableSheet(NPOIExcel excel)
+ {
+ bool result = false;
+ try
+ {
+ if("テンプレート" == excel.Sheet.SheetName
+ || excel.GetCellForceString("B4") != "テーブル名"
+ || excel.GetCellForceString("B6") != "No"
+ || excel.GetCellForceString("B7") != "1"
+ || excel.GetCellForceString("D6") != "項目名"
+ || excel.GetCellForceString("K6") != "説明"
+ || excel.GetCellForceString("S6") != "型"
+ || excel.GetCellForceString("X6") != "PK")
+ {
+ result = false;
+ return result;
+ }
+
+ result = true;
+ return result;
+ }
+ catch (Exception ex)
+ {
+ OperationLog.Instance.WriteLog($"{MethodInfo.GetCurrentMethod()}:{ex.Message}");
+ result = false;
+ return result;
+ }
+ finally
+ {
+ OperationLog.Instance.WriteLog($"{excel.Sheet.SheetName} ⇒ テーブル定義シート:{ (result ? "Yes" : "No") }");
+ }
+ }
+
+ /// <summary>
+ /// シート情報よりテーブル作成する
+ /// </summary>
+ /// <param name="sheet"></param>
+ public bool CreateBySheet(NPOIExcel excel)
+ {
+ try
+ {
+ OperationLog.Instance.WriteLog($"{MethodInfo.GetCurrentMethod()}:{excel.Sheet.SheetName}");
+ string[] tables = excel.GetCellString("G4").Split(new char[] { ',' });
+
+ using (TableCreator creator = new TableCreator())
+ using (DataAccess dataAccess = new MsSqlNet(DBSetting))
+ {
+
+ //DB中のデータ取得
+ var dbFields = dataAccess.GetDataReader<Dictionary<string, Field>>($"EXECUTE [dbo].[GetTableDefine] '{tables[0]}'", (reader, data) =>
+ {
+ while (reader.Read())
+ {
+ var item = new Field(reader);
+ data.Add(item.Name, item);
+ }
+ });
+
+ bool isNew = dbFields == null || dbFields.Count == 0;
+ StringBuilder sqlEdit = new StringBuilder();
+
+ //Excelを読込む
+ List<Field> curFields = new List<Field>();
+ int r = 0;
+ for (int i = 6; i < excel.Sheet.LastRowNum; i++)
+ {
+ int no = excel.GetCellInt($"B{i + 1}");
+ if (no != (r + 1)) { continue; } //必ず連続
+ r++;
+ string colName = excel.GetCellString($"D{i + 1}");
+ if (colName.Length == 0) { break; }
+
+ string pk = excel.GetCellString($"X{i + 1}").ToUpper();
+ var curItem = new Field
+ {
+ Name = colName,
+ Description = excel.GetCellString($"K{i + 1}"),
+ DataType = excel.GetCellString($"S{i + 1}"),
+ IsPrimaryKey = pk.Length > 0,
+ IsIdentity = pk == "AUTO"
+ };
+
+ creator.Fields.Add(curItem); //無条件追加、データ型変更した場合、テーブル再作成になる
+
+ Field dbItem;
+ if (dbFields != null && dbFields.TryGetValue(colName, out dbItem))
+ {
+ //突合(追加・変更分のみ)
+ int ret = dbItem.CompareTo(curItem);
+ if (ret == 1 || ret == 12)
+ {
+ //削除
+ sqlEdit.AppendLine($@"IF EXISTS(SELECT * FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID('*TableName*') AND [name] = N'MS_Description' AND [minor_id] = (SELECT [column_id] FROM SYS.COLUMNS WHERE [name] = '{curItem.Name}' AND [object_id] = OBJECT_ID('*TableName*')))
+EXEC sys.sp_dropextendedproperty @name=N'MS_Description' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'*TableName*', @level2type=N'COLUMN',@level2name=N'{curItem.Name}';");
+
+
+ if (curItem.Description.Length > 0)
+ {
+ sqlEdit.AppendLine($"EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{curItem.Description}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'*TableName*', @level2type=N'COLUMN',@level2name=N'{curItem.Name}';");
+ }
+ }
+
+ if (ret == 2 || ret == 12)
+ {
+ //タイプ変更があったら、削除してから、再作成のほうが増し
+ isNew = true;
+ //例:DateTime⇒intではダメ
+ //sqlEdit.AppendLine($"ALTER TABLE [*TableName*] ALTER COLUMN {curItem.Name} {curItem.DataType} NULL;");
+ //sqlEdit.AppendLine($"ALTER TABLE [*TableName*] DROP COLUMN {curItem.Name};");
+ //sqlEdit.AppendLine($"ALTER TABLE [*TableName*] ADD {curItem.Name} {curItem.DataType} NULL;");
+ }
+ }
+ else
+ {
+ //新規追加
+ sqlEdit.AppendLine($"ALTER TABLE [*TableName*] ADD {curItem.Name} {curItem.DataType} NULL;");
+ }
+ }
+
+ if(!isNew && sqlEdit.Length == 0) { return true; }
+
+ //作成
+ string sql = String.Empty;
+ foreach (string tableName in tables)
+ {
+ if (isNew)
+ {
+ creator.Name = tableName;
+ creator.Description = excel.GetCellString("G5");
+ creator.PartitionSchema = excel.GetCellString("X4");
+ creator.PartitionKey = excel.GetCellString("AH4");
+ sql = creator.ToString();
+ }
+ else
+ {
+ sql = sqlEdit.ToString().Replace("*TableName*", tableName);
+ }
+
+ int ret = dataAccess.ExecuteNonQuery(sql);
+ OperationLog.Instance.WriteLog(sql);
+ if (ret == -1) { return false; }
+ }
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ OperationLog.Instance.WriteLog($"{MethodInfo.GetCurrentMethod()}:{ex.Message}");
+ return false;
+ }
+ }
+
+ }
+}
--
Gitblit v1.10.0