Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            //Step1. 備份檔案
            //Step1.1. 本機檔案讀取
            var           filename        = "PATMPatientItem";
            DirectoryInfo readlocalfile   = new DirectoryInfo($@"C:\Users\user\Downloads\{filename}.csv");
            DataTable     local_dt        = TxtConvertToDataTable(readlocalfile.ToString(), "localfile", "|");
            string        firstColumnName = local_dt.Columns[0].ColumnName;

            DataRow[] rows = local_dt.Select();

            //Step1.2. 檔案讀取→\\10.1.225.17\d$\csv  \\10.1.225.17\d$\CSV - 複製
            var    host     = @"10.1.225.17";
            var    RDPfile  = "CSV";
            var    username = @"LAPTOP-ODUSIH5U\Administrator";
            var    password = "******";
            string old_path = "";
            string new_path = $@"\\{host}\d$\{RDPfile}\" + filename + ".csv";

            using (new RDPCredentials(host, username, password))
            {
                //Step1.3. 找到相對應File
                DirectoryInfo readfile = new DirectoryInfo($@"\\{host}\d$\{RDPfile}\{filename}.csv");
                //Step1.4. 將File中的資料存入var
                string LastWriteTime = File.GetLastWriteTime(readfile.ToString()).ToString("yyyyMMdd");
                old_path = $@"\\{host}\d$\{RDPfile}\" + filename + "_" + LastWriteTime + ".csv";
                //old_path = $@"\\{host}\d$\{RDPfile}\" + filename + "_" + "2.csv";

                //Step1.5. 修改名稱(原File_修改日期yyyyMMdd)--備份
                //readfile.MoveTo($@"\\{host}\d$\{RDPfile}\" + filename + "_" + LastWriteTime + ".csv");
                readfile.MoveTo(old_path);

                //Step1.6. 將下載的File 複製到 mstv
                File.Copy(readlocalfile.ToString(), new_path);
            }
            //Step2. SSMS import CSV
            //Step2.1. 連線SSMS
            IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsetting.json", optional: true, reloadOnChange: true).Build();
            //取得連線字串
            string            connString = config.GetConnectionString("DefaultConnection");
            SqlServerDBHelper sqlHelper  = new SqlServerDBHelper(string.Format(connString, "HISDB", "msdba", "1qaz@wsx"));
            //Step2.2. 將檔案名稱丟入SQL
            string    sqlOldCSV  = $@"select * from {filename}";
            string    sqlCSV     = $@"--use [HISDB];
                              --use[HISBILLINGDB];
                              --, CODEPAGE = 65001
                              --已更新至225.17
                             DECLARE @TABLENAME VARCHAR(MAX) = '{filename}'; --檔案名稱去除CSV

                             IF LEFT(@TABLENAME,3) IN('CHG', 'CLA')
                             BEGIN
                             use[HISBILLINGDB];
                             END
                             ELSE
                             BEGIN
                             use[HISDB];
                             END

                             EXEC('TRUNCATE TABLE ' + @TABLENAME)
                             DECLARE @INS_CNT INT,@UPD_CNT INT
                             DECLARE @START_TIME VARCHAR(24)
                             SET @START_TIME = CONVERT(VARCHAR(24), GETDATE(), 121)
                             DECLARE @ERR_NO INT
                             DECLARE @SP_NAME VARCHAR(100) = ('mSP_INS_' + @TABLENAME + '_all');
                             --DECLARE @SP_NAME VARCHAR(100) = ('mSP_INS_' + @TABLENAME + '_fromExternal');
                             EXEC @ERR_NO = @SP_NAME @INS_CNT OUTPUT, @UPD_CNT OUTPUT
                             PRINT @ERR_NO;
                             IF @ERR_NO = 0 BEGIN
                             EXEC('SELECT * FROM ' + @TABLENAME);
                             END;";
            DataTable old_CSV_dt = sqlHelper.FillTableAsync(sqlOldCSV).Result;
            DataTable new_CSV_dt = sqlHelper.FillTableAsync(sqlCSV).Result;
            int       rowCount   = (new_CSV_dt == null) ? 0 : new_CSV_dt.Rows.Count;

            Console.WriteLine(rowCount);
            int rowCount_old = (old_CSV_dt == null) ? 0 : old_CSV_dt.Rows.Count;

            Console.WriteLine(rowCount_old);
            DataRow[] id_row = new_CSV_dt.Select();

            //Step3. 核對 SQL 跟 檔案中筆數及ID是否正確
            bool status = true;

            //Step3.1. Map ListA & ListB 是否相同
            for (int i = 56; i < rows.Length; i++)
            {
                bool intStatus = Int32.TryParse(rows[i][firstColumnName].ToString(), out int num);
                if (intStatus)
                {
                    for (int c = 56; c < id_row.Length; c++)
                    {
                        if (!Equals(num, id_row[c][firstColumnName]))
                        {
                            status = false;
                        }
                        else
                        {
                            status = true;
                            break;
                        }
                    }
                }
            }
            //Step3.3. 回傳比對結果
            Console.WriteLine(status);
            //Step3.3.1 如果失敗必須先將備份的File名稱rename
            if (!status)
            {
                using (new RDPCredentials(host, username, password))
                {
                    FileInfo readfile_new = new FileInfo(new_path);
                    readfile_new.Delete();
                    DirectoryInfo readfile_old = new DirectoryInfo(old_path);
                    readfile_old.MoveTo(new_path);
                }
                // Step3.3.2 重新匯入225.17
                var reault = sqlHelper.FillTableAsync(sqlCSV).Result;
            }
            else
            {
                //Step4. 比對新跟舊的差異發送Email
                DataTable       compare_result  = CompareRows(old_CSV_dt, new_CSV_dt);
                DatatableToHTML datatableToHTML = new DatatableToHTML();
                //Step4.3. 將List_sync利用Email寄發
                var    helper      = new SMTPHelper("*****@*****.**", "koormyktfbbacpmj", "smtp.gmail.com", 587, true, true);                                                                                                                                        //寄出信email
                string subject     = $"Initial Data異動 {DateTime.Now.ToString("yyyyMMdd")}";                                                                                                                                                                                  //信件主旨
                string body        = $"Hi All, \r\n\r\n{DateTime.Now.ToString("yyyyMMdd")} {filename}.csv更改如下表,\r\n\r\n{(datatableToHTML.ToHTML(compare_result) == null ? string.Empty : datatableToHTML.ToHTML(compare_result))}\r\n\r\n Best Regards, \r\n\r\n Vicky Yin"; //信件內容
                string attachments = null;                                                                                                                                                                                                                                   //附件

                /*var fileName = @"D:\微軟MCS\SchedulerDB_Excel\" + excelname;//附件位置
                 * if (File.Exists(fileName.ToString()))
                 * {
                 *  attachments = fileName.ToString();
                 * }*/
                string toMailList = "[email protected];[email protected]"; //收件者
                string ccMailList = "";                                            //CC收件者

                helper.SendMail(toMailList, ccMailList, null, subject, body, null);

                //Step5. 同步到各個DB
                //Step5.1 讀取相對應SyncData
                //Step5.2 執行同步到各個DB
            }
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            string         sql    = @"
                            SELECT 'BLOMBlood' SourceTable,a.ChargeItemId,a.ChargeCode,a.ItemChineseName, a.CreateTime,a.ModifyTime ,b.BloodId ItemId,b.BloodCode ItemCode,b.BloodChineseName ItemName
                            FROM dbo.CHGMChargeItem a FULL OUTER JOIN dbo.BLOMBlood b ON a.ChargeItemId = b.BloodId 
                            WHERE a.OrderTypeCode = 'BLO' AND (a.ChargeItemId IS NULL OR b.BloodId IS NULL OR a.ChargeCode <> b.BloodCode)
                            UNION all
                            SELECT 'EXAMExamination' SourceTable,a.ChargeItemId,a.ChargeCode,a.ItemChineseName, a.CreateTime,a.ModifyTime ,b.ExaminationId ItemId,b.ExaminationCode ItemCode,b.ExamChineseName ItemName
                            FROM dbo.CHGMChargeItem a FULL OUTER JOIN dbo.EXAMExamination b ON a.ChargeItemId = b.ExaminationId 
                            WHERE a.OrderTypeCode = 'EXA' AND (a.ChargeItemId IS NULL OR b.ExaminationId IS NULL OR a.ChargeCode <> b.ExaminationCode)
                            UNION all
                            SELECT 'LABMLaboratory' SourceTable,a.ChargeItemId,a.ChargeCode,a.ItemChineseName, a.CreateTime,a.ModifyTime ,b.LaboratoryId ItemId,b.LaboratoryCode ItemCode,b.LaboratoryChineseName ItemName
                            FROM dbo.CHGMChargeItem a FULL OUTER JOIN dbo.LABMLaboratory b ON a.ChargeItemId = b.LaboratoryId 
                            WHERE a.OrderTypeCode = 'LAB' AND (a.ChargeItemId IS NULL OR b.LaboratoryId IS NULL OR a.ChargeCode <> b.LaboratoryCode)
                            UNION all
                            SELECT 'OPRMOperation' SourceTable,a.ChargeItemId,a.ChargeCode,a.ItemChineseName, a.CreateTime,a.ModifyTime ,b.OperationId ItemId,b.OperationCode ItemCode,b.OprChineseName ItemName
                            FROM dbo.CHGMChargeItem a FULL OUTER JOIN dbo.OPRMOperation b ON a.ChargeItemId = b.OperationId 
                            WHERE a.OrderTypeCode = 'OPR' AND (a.ChargeItemId IS NULL OR b.OperationId IS NULL OR a.ChargeCode <> b.OperationCode)
                            UNION all
                            SELECT 'PHRMMedication' SourceTable,a.ChargeItemId,a.ChargeCode,a.ItemChineseName, a.CreateTime,a.ModifyTime,b.MedicationId ItemId,b.MedicationCode ItemCode,b.GenericName ItemName
                            FROM dbo.CHGMChargeItem a FULL OUTER JOIN dbo.PHRMMedication b ON a.ChargeItemId = b.MedicationId 
                            WHERE a.OrderTypeCode = 'PHR' AND (a.ChargeItemId IS NULL OR b.MedicationId IS NULL OR a.ChargeCode <> b.MedicationCode)
                            UNION all
                            SELECT 'PEXMHealthCheckItem' SourceTable,a.ChargeItemId,a.ChargeCode,a.ItemChineseName, a.CreateTime,a.ModifyTime ,b.HealthCheckItemId  ItemId,b.HealthCheckItemCode ItemCode,b.ItemChineseName ItemName
                            FROM dbo.CHGMChargeItem a FULL OUTER JOIN dbo.PEXMHealthCheckItem b ON a.ChargeItemId = b.HealthCheckItemId 
                            WHERE a.OrderTypeCode = 'PEX' AND (a.ChargeItemId IS NULL OR b.HealthCheckItemId IS NULL OR a.ChargeCode <> b.HealthCheckItemCode)
                            UNION all
                            SELECT 'TREMTreatment' SourceTable,a.ChargeItemId,a.ChargeCode,a.ItemChineseName, a.CreateTime ,a.ModifyTime,b.TreatmentId ItemId,b.TreatmentCode ItemCode,b.TreatmentChineseName ItemName
                            FROM dbo.CHGMChargeItem a FULL OUTER JOIN dbo.TREMTreatment b ON a.ChargeItemId = b.TreatmentId 
                            WHERE a.OrderTypeCode = 'TRE' AND (a.ChargeItemId IS NULL OR b.TreatmentId IS NULL OR a.ChargeCode <> b.TreatmentCode)
                            ";
            IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsetting.json", optional: true, reloadOnChange: true).Build();
            //取得連線字串
            string connString = config.GetConnectionString("DefaultConnection");
            //string connString = "Data Source=10.1.222.181;Initial Catalog={0};Integrated Security=False;User ID={1};Password={2};Pooling=True;MultipleActiveResultSets=True;Connect Timeout=120;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite";
            SqlServerDBHelper sqlHelper = new SqlServerDBHelper(string.Format(connString, "HISDB", "msdba", "1qaz@wsx"));
            List <DBdata>     migrationTableInfoList = sqlHelper.QueryAsync <DBdata>(sql).Result?.ToList();
            DataTable         dt = sqlHelper.FillTableAsync(sql).Result;

            /*var excelname = new FileInfo(DateTime.Now.ToString("yyyyMMddhhmm") + ".xlsx");
             * //ExcelPackage.LicenseContext = LicenseContext.Commercial;
             * ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
             * using (var excel = new ExcelPackage(excelname))
             * {
             *  excel.Workbook.Worksheets.Add("結果");
             *  ExcelWorksheet firstsheet = excel.Workbook.Worksheets[0];
             *  int rowIndex = 1;
             *  int colIndex = 1;
             *  //4.3.1塞資料到某一格
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "SourceTable";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "ChargeItemId";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "ChargeCode";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "ItemChineseName";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "CreateTime";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "ModifyTime";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "ItemId";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "ItemCode";
             *  firstsheet.Cells[rowIndex, colIndex++].Value = "ItemName";
             *  //4.3.2 Cell Style
             *  firstsheet.Cells[rowIndex, 1, rowIndex, colIndex - 1]
             *   .SetQuickStyle(Color.Black, Color.LightPink, ExcelHorizontalAlignment.Center);
             *
             *  foreach (var v in migrationTableInfoList)
             *  {
             *      rowIndex++;
             *      colIndex = 1;
             *      firstsheet.Cells[rowIndex, colIndex++].Value = v.SourceTable;
             *      firstsheet.Cells[rowIndex, colIndex++].Value = v.ChargeItemId;
             *      firstsheet.Cells[rowIndex, colIndex++].Value = v.ChargeCode;
             *      firstsheet.Cells[rowIndex, colIndex++].Value = v.ItemChineseName;
             *      firstsheet.Cells[rowIndex, colIndex].Value = v.CreateTime;
             *      firstsheet.Cells[rowIndex, colIndex].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
             *      firstsheet.Cells[rowIndex, colIndex++].Style.Numberformat.Format = "yyyy/MM/dd HH:mm:ss";
             *      firstsheet.Cells[rowIndex, colIndex].Value = v.ModifyTime;
             *      firstsheet.Cells[rowIndex, colIndex].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
             *      firstsheet.Cells[rowIndex, colIndex++].Style.Numberformat.Format = "yyyy/MM/dd HH:mm:ss";
             *      firstsheet.Cells[rowIndex, colIndex++].Value = v.ItemId;
             *      firstsheet.Cells[rowIndex, colIndex++].Value = v.ItemCode;
             *      firstsheet.Cells[rowIndex, colIndex++].Value = v.ItemName;
             *
             *  }
             *  //4.3.3 儲存格和字數相等
             *  int startColumn = firstsheet.Dimension.Start.Column;
             *  int endColumn = firstsheet.Dimension.End.Column;
             *  for (int count = startColumn; count <= endColumn; count++)
             *  {
             *      firstsheet.Column(count).AutoFit();
             *  }
             *  Byte[] bin = excel.GetAsByteArray();
             *  File.WriteAllBytes(@"C:\Users\v-vyin\SchedulerDB_ExcelFile\" + excelname, bin);
             *
             * }*/
            DatatableToHTML datatableToHTML = new DatatableToHTML();

            var helper = new SMTPHelper($"{config[$"SendEmail:FromAddressMail"]}",
                                        $"{config[$"SendEmail:FromAddressMailPassword"]}",
                                        $"{config[$"SendEmail:SMTPHost"]}",
                                        int.Parse($"{config[$"SendEmail:SMTPPort"]}"),
                                        bool.Parse($"{config[$"SendEmail:SMTPEnableSsl"]}"),
                                        bool.Parse($"{config[$"SendEmail:UseDefaultCredentials"]}"));                                         //寄出信email
            string subject     = $"有關收標與子檔無法對應項目";                                                                                            //信件主旨
            string body        = $"Hi All, \r\n\r\n無法對應的項目如下表,\r\n\r\n{datatableToHTML.ToHTML(dt)}\r\n\r\n Best Regards, \r\n\r\n Vicky Yin"; //信件內容
            string attachments = null;                                                                                                        //附件

            /* var fileName = $@"C:\Users\v-vyin\SchedulerDB_ExcelFile\{excelname}";//附件位置
             * if (File.Exists(fileName.ToString()))
             * {
             *   attachments = fileName.ToString();
             * }*/
            //string toMailList = "*****@*****.**";//收件者
            //string ccMailList = "";//CC收件者
            string toMailList = $"{config[$"TargetTable:toMail"]}"; //收件者
            string ccMailList = $"{config[$"TargetTable:ccMail"]}"; //CC收件者

            helper.SendMail(toMailList, ccMailList, null, subject, body, null);
        }