using Microsoft.AspNetCore.Http; using NLog; using Npgsql; using Server.SQL; using Server.System; using System.Globalization; namespace Server.Git { public class ExcelSQL { private static readonly NLog.ILogger logger = LogManager.GetCurrentClassLogger(); List sheets; public ExcelSQL(List sheets) { this.sheets = sheets; } public void DataUpdate() { using (NpgsqlConnection connection = new NpgsqlConnection(STATICS.EXCEL_SQL_URL)) { try { // 데이터베이스 연결 열기 connection.Open(); // 쿼리 작성 및 실행 //모든 쿼리 삭제 string query; string header1 = "CREATE TABLE excel."; string header2 = "INSERT INTO excel."; string newTableQuery; string tableDatas; #region 모든 테이블 삭제 query = "DROP SCHEMA excel CASCADE;" + "CREATE SCHEMA excel AUTHORIZATION manager;"; ExecuteNonQuery(connection, query); #endregion #region 테이블 세팅 query = ""; for (int n = 0; n < sheets.Count; n++) { if (sheets[n].dataEnum[0] == "client") continue; //초기화 newTableQuery = ""; tableDatas = "("; #region 신규 테이블 생성 newTableQuery += header1; newTableQuery += sheets[n].name + "("; for (int m = 0; m < sheets[n].variable.Count; m++) { if (sheets[n].type[m] == "long" && sheets[n].variable[m] == "index") { newTableQuery += "index SERIAL PRIMARY KEY"; tableDatas += "index"; continue; } if (m != 0) { newTableQuery += ","; tableDatas += ", "; } switch (sheets[n].type[m]) { case "bool": newTableQuery += $"{sheets[n].variable[m]} BOOL "; break; case "int": newTableQuery += $"{sheets[n].variable[m]} INT "; break; case "float": newTableQuery += $"{sheets[n].variable[m]} FLOAT4 "; break; case "string": case "json": newTableQuery += $"{sheets[n].variable[m]} VARCHAR(255) "; break; case "enum": newTableQuery += $"{sheets[n].variable[m]} INT2 "; break; case "text": newTableQuery += $"{sheets[n].variable[m]} TEXT "; break; case "time": newTableQuery += $"{sheets[n].variable[m]} timestamp "; break; default: logger.Error($"unknown data {sheets[n].type[m]}"); break; } tableDatas += sheets[n].variable[m]; } newTableQuery += ");\n"; tableDatas += ") VALUES "; bool isStart = true; query += newTableQuery; #endregion #region 신규 테이블 데이터 올리기 query += header2; query += sheets[n].name; query += tableDatas; foreach(KeyValuePair> pair in sheets[n].dicViewer) { if (isStart) { isStart = !isStart; } else { query += ", "; } query += "("; for (int m = 0; m < sheets[n].variable.Count; m++) { if (m != 0) { query += ", "; } switch (sheets[n].type[m]) { case "bool": case "enum": case "int": case "float": query += $"{pair.Value[sheets[n].variable[m]]}"; break; case "string": case "json": case "text": query += $"'{pair.Value[sheets[n].variable[m]]}'"; break; case "time": query += $"'{((DateTime)pair.Value[sheets[n].variable[m]]).ToString("yyyy-MM-dd HH:mm:ss")}'"; break; default: logger.Error($"unknown data value {sheets[n].type[m]}"); break; } } query += ")"; } query += ";"; #endregion } ExecuteNonQuery(connection, query); #endregion } catch (Exception ex) { logger.Error($"Error: {ex.Message}"); } } } private void ExecuteNonQuery(NpgsqlConnection connection, string query) { using (NpgsqlCommand command = new NpgsqlCommand(query, connection)) { logger.Info(query); command.ExecuteNonQuery(); } } } }