public static bool TryCopyToDB(PostgreSql db, ExcelImportBase import)
        {
            var dbRows = new List <Dictionary <String, object> >();

            if (!db.ExecuteQuery($"select * from {import.TableName};", ref dbRows))
            {
                Console.WriteLine($"DB query failed, {import.TableName}");
                return(false);
            }

            var dbValues = new List <object[]>();

            if (!GetAllValues(dbRows, import.ColumnNames, ref dbValues))
            {
                Console.WriteLine($"Get db query failed, {import.TableName}");
                return(false);
            }

            var tableValues = new List <object[]>();

            import.ResetId();
            foreach (var row in import.GetRows())
            {
                try
                {
                    var tableValue = import.GetValues(row);
                    tableValues.Add(tableValue);
                }
                catch (Exception e)
                {
                    errorMsgQ.Enqueue($"{import.FileName} 테이블에서 예외가 발생하였습니다.");
                    return(false);
                }
            }

            var addedTable   = new List <object[]>();
            var missingTable = new List <object[]>();

            if (!GetAllChanges(ref tableValues, ref dbValues, ref addedTable, ref missingTable))
            {
                Console.WriteLine($"{import.TableName} 테이블 데이터의 바뀐 내용이 없습니다.");
                return(true);
            }
            else
            {
                var modifiedTable = new List <object[]>();
                GetModifiedTable(ref addedTable, ref modifiedTable, ref missingTable, import.FileName);
                var changes = new Tuple <ExcelImportBase, List <object[]>, List <object[]>, List <object[]> >(import, addedTable, modifiedTable, missingTable);
                changesQ.Enqueue(changes);
                Console.WriteLine($"{import.TableName} 테이블의 수정 사항이 생겼습니다.");
                return(true);
            }
        }
        public static int ExecuteImport(string dirPathName)
        {
            AppSettingsReader settingsReader = new AppSettingsReader();
            string            connStr        = settingsReader.GetValue("PostgreSQLConnectionString", typeof(string)) as string;

            Console.WriteLine(connStr);

            PostgreSql db = new PostgreSql(connStr);

            Task[] tasks = new Task[8];
            for (int i = 0; i < tasks.Length; i++)
            {
                tasks[i] = Task.Run(() =>
                {
                    PostgreSql taskdb = new PostgreSql(connStr);

                    while (true)
                    {
                        if (!excelSheetQ.TryDequeue(out var import))
                        {
                            return;
                        }

                        TryCopyToDB(taskdb, import);
                    }
                });
            }

            foreach (var task in tasks)
            {
                task.Wait();
            }

            if (PrintErrorMsg())
            {
                return(1);
            }

            while (true)
            {
                if (!changesQ.TryDequeue(out var changes))
                {
                    break;
                }

                ApplyChanges(db, changes);
            }
            return(0);
        }
        private static bool ApplyChanges(PostgreSql db, Tuple <ExcelImportBase, List <object[]>, List <object[]>, List <object[]> > changes)
        {
            var import        = changes.Item1;
            var addedTable    = changes.Item2;
            var modifiedTable = changes.Item3;
            var missingTable  = changes.Item4;

            int idIdx = 0;

            idIdxDic.TryGetValue(import.FileName, out idIdx);

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine($"{import.TableName} 테이블에 추가된 항목 수 : {addedTable.Count}");
            foreach (object[] added in addedTable)
            {
                Console.WriteLine($"{import.TableName} 테이블에 추가된 항목의 id : {added[idIdx]}");
            }

            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine($"{import.TableName} 테이블에 수정된 항목 수 : {modifiedTable.Count}");
            foreach (object[] modi in modifiedTable)
            {
                Console.WriteLine($"{import.TableName} 테이블에 수정된 항목의 id : {modi[idIdx]}");
            }

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine($"{import.TableName} 테이블에 누락된 항목 수 : {missingTable.Count}");
            foreach (object[] missing in missingTable)
            {
                Console.WriteLine($"{import.TableName} 테이블에 누락된 항목의 id : {missing[idIdx]}");
            }

            Console.ResetColor();

            if (!DecideApply(import.TableName))
            {
                return(false);
            }

            if (!db.ImportFrom(import))
            {
                Console.WriteLine($"DB Insert Fail!!, {import.TableName}");
                return(false);
            }

            return(true);
        }