Beispiel #1
0
        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();
        }
Beispiel #2
0
        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();
            }
        }