private void DoSyncWork() { Delegate dgvEvt = new UpdateProgressToggles(dgv_UpdateProgressToggles); string smsg, dmsg; int ok = 0, fail = 0, miss = 0, index = 0, total = 0; try { Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "正在获取数据库连接"); GetDBConfigForService(); Thread.Sleep(1000); Invoke(dgvEvt, cur, 2, "正在测试数据库连接"); TryDBConfigForService(); Thread.Sleep(1000); Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, "完成"); List <PlanDataItem> piis = PlanHelper.Create().GetPlanItemDataOrdered(PlanData.ID); foreach (PlanDataItem pii in piis) { for (cur = 1; cur < 5; cur++) { Invoke(dgvEvt, cur, 0, nullImage); Invoke(dgvEvt, cur, 2, ""); } Thread.Sleep(100); cur = 1; Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, $@"正在获取""{pii.PlanDataName}""的同步设置"); string srcSql = GetSql("Src", pii.PlanSql); string dstSql = GetSql("Dst", pii.PlanSql); Thread.Sleep(1000); Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, $@"""{pii.PlanDataName}"" - 准备就绪"); cur = 2; Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "正在获取数据"); DataSet ds = SQLHelper.QueryDataSet(Src, srcSql, null, out smsg); if (ds.Tables.Count == 0) { throw new Exception($@"数据库查询'{srcSql}'没有返回表"); } Invoke(dgvEvt, cur, 0, Resources.success); total = ds.Tables[0].Rows.Count; Invoke(dgvEvt, cur, 2, $@"发现{total}条数据"); cur = 3; ok = 0; fail = 0; miss = 0; Invoke(dgvEvt, cur, 0, Resources.busy2); index = 0; foreach (DataRow dr in ds.Tables[0].Rows) { index++; Invoke(dgvEvt, cur, 2, $@"正在复制第{index}条(共{total}条)"); List <IDbDataParameter> paras = new List <IDbDataParameter>(); foreach (DataColumn col in ds.Tables[0].Columns) { IDbDataParameter para = SQLHelper.CreateParameter(Dest, "@" + col.ColumnName, dr[col], out dmsg); paras.Add(para); } try { SQLHelper.NonQuery(Dest, dstSql, paras, out dmsg); ok++; } catch (Exception ex) { string msg = ex.Message; Regex skipRegex = new Regex("^(SKIP).*$"); if (skipRegex.IsMatch(msg)) { miss++; } else { if (ex is SqlException && (ex as SqlException).Class == 18) { fail++; } else { if (pii.FailMode == FailMode.退出执行) { throw; } } } File.AppendAllText(pii.PlanDataName + ".txt", msg + Environment.NewLine); } } Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, $@"复制成功{ok}条,失败{fail}条,忽略{miss}条"); Thread.Sleep(1000); cur = 4; Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "进行中"); Thread.Sleep(1000); Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, $@"复制成功{ok}条,失败{fail}条,忽略{miss}条"); Thread.Sleep(1000); cur = 1; } cur = 5; Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "进行中"); Thread.Sleep(1000); Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, "完成"); } catch (Exception ex) { Message = ex.Message; Invoke(new btnMessageShow(() => btnMessage.Visible = true), null); Invoke(dgvEvt, cur, 0, Resources.fail); Invoke(dgvEvt, cur, 2, "失败"); } timer.Stop(); }
private void InitAndDoSyncWork() { //初始化并开始同步 Delegate dgvEvt = new UpdateProgressToggles(dgv_UpdateProgressToggles); string smsg, dmsg; int ok = 0, fail = 0, miss = 0, index = 0, total = 0; int cur = 0; foreach (PlanData PlanData in PlanHelper.Create().GetPlanData((plan) => { bool ret = true; ret &= plan.Enable; bool onetime = //执行一次的任务判断 DateTime.Now.ToString("yyyy-MM-dd HH:mm").Equals($@"{plan.PlanDate:yyyy-MM-dd} {plan.PlanTime:HH:mm}") && plan.PlanDateModel == PlanDateModel.执行一次; bool repeat = //重复执行的判断 plan.PlanDateModel == PlanDateModel.重复执行; bool everyday = (DateTime.Now.Date - plan.LastSuccessTime).Days >= plan.PlanDayStep; everyday &= plan.PlanTimeModel == PlanTimeModel.每天; bool everyweek = (DateTime.Now.Date - plan.LastSuccessTime).Days / 7 >= plan.PlanDayStep; everyweek &= plan.PlanWeek.ToString() .Contains((DateTime.Now.Date.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)DateTime.Now.Date.DayOfWeek) .ToString()); everyweek &= plan.PlanTimeModel == PlanTimeModel.每周; bool time = (int)((DateTime.Now.TimeOfDay - plan.LastSuccessTime.TimeOfDay).TotalMinutes) >= plan.PlanTimeStep; time |= (DateTime.Now.Date - plan.PlanDate).TotalDays > 0; ret &= onetime || (repeat && (everyday || everyweek) && time); ret &= (!plan.Working); return(ret); })) { try { PlanData.Working = true; PlanHelper.Create().UpdatePlanData(PlanData); //Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "正在获取数据库连接", "任务初始化", "数据库连接"); GetDBConfigForService(); Thread.Sleep(1000); Invoke(dgvEvt, cur, 2, "正在测试数据库连接", "任务初始化", "数据库连接"); TryDBConfigForService(); Thread.Sleep(1000); //Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, "完成", "任务初始化", "数据库连接"); List <PlanDataItem> piis = PlanHelper.Create().GetPlanItemDataOrdered(PlanData.ID); foreach (PlanDataItem pii in piis) { for (cur = 1; cur < 5; cur++) { //Invoke(dgvEvt, cur, 0, nullImage); //Invoke(dgvEvt, cur, 2, ""); } Thread.Sleep(100); cur = 1; //Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, $@"正在获取""{pii.PlanDataName}""的同步设置", PlanData.Name, $"{pii.PlanDataName} - 正在准备同步"); string srcSql = GetSql("Src", pii.PlanSql); string dstSql = GetSql("Dst", pii.PlanSql); Thread.Sleep(1000); //Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, $@"""{pii.PlanDataName}"" - 准备就绪", PlanData.Name, $"{pii.PlanDataName} - 正在开始步骤"); cur = 2; //Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "正在获取数据", PlanData.Name, $"{pii.PlanDataName} - 正在获取数据"); DataSet ds = SQLHelper.QueryDataSet(Src, srcSql, null, out smsg); if (ds.Tables.Count == 0) { throw new Exception($@"数据库查询'{srcSql}'没有返回表"); } //Invoke(dgvEvt, cur, 0, Resources.success); total = ds.Tables[0].Rows.Count; Invoke(dgvEvt, cur, 2, $@"发现{total}条数据", PlanData.Name, $"{pii.PlanDataName} - 正在获取数据"); cur = 3; ok = 0; fail = 0; miss = 0; //Invoke(dgvEvt, cur, 0, Resources.busy2); index = 0; foreach (DataRow dr in ds.Tables[0].Rows) { index++; Invoke(dgvEvt, cur, 2, $@"正在复制第{index}条(共{total}条)", PlanData.Name, $"{pii.PlanDataName} - 正在获取数据"); List <IDbDataParameter> paras = new List <IDbDataParameter>(); foreach (DataColumn col in ds.Tables[0].Columns) { IDbDataParameter para = SQLHelper.CreateParameter(Dest, "@" + col.ColumnName, dr[col], out dmsg); paras.Add(para); } try { SQLHelper.NonQuery(Dest, dstSql, paras, out dmsg); ok++; } catch (Exception ex) { string msg = ex.Message; Regex skipRegex = new Regex("^(SKIP).*$"); if (skipRegex.IsMatch(msg)) { miss++; } else { if (ex is SqlException && (ex as SqlException).Class == 18) { fail++; } else { if (pii.FailMode == FailMode.退出执行) { throw; } } } File.AppendAllText(pii.PlanDataName + ".txt", msg + Environment.NewLine); } } //Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, $@"复制成功{ok}条,失败{fail}条,忽略{miss}条", PlanData.Name, $"{pii.PlanDataName} - 正在获取数据"); Thread.Sleep(1000); cur = 4; //Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "进行中", PlanData.Name, $"{pii.PlanDataName} - 正在结束步骤"); Thread.Sleep(1000); //Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, $@"复制成功{ok}条,失败{fail}条,忽略{miss}条", PlanData.Name, $"{pii.PlanDataName} - 正在结束步骤"); Thread.Sleep(1000); cur = 1; } cur = 5; //Invoke(dgvEvt, cur, 0, Resources.busy2); Invoke(dgvEvt, cur, 2, "进行中", PlanData.Name, "正在结束同步"); Thread.Sleep(1000); //Invoke(dgvEvt, cur, 0, Resources.success); Invoke(dgvEvt, cur, 2, "完成", PlanData.Name, "正在结束同步"); PlanData.LastSuccessTime = DateTime.Now; PlanData.Working = false; PlanHelper.Create().UpdatePlanData(PlanData); } catch (Exception ex) { //Message = ex.Message; //Invoke(new btnMessageShow(()=>btnMessage.Visible=true), null); //Invoke(dgvEvt, cur, 0, Resources.fail); Invoke(dgvEvt, cur, 2, "失败" + "\r\n" + ex.Message, PlanData.Name, "出错信息"); PlanData.Working = false; PlanHelper.Create().UpdatePlanData(PlanData); } //timer.Stop(); } }