Пример #1
0
        /// <summary>
        /// 判断任务有无执行完成
        /// </summary>
        /// <param name="dr"></param>
        public void RunSingleTask(DataRow dr)
        {
            if (dr == null)
            {
                return;
            }
            string constraintValue = new DBConfigHelper().GetLastSyncNo(dr["TaskID"].ToString()); //最新的时间或者序号
            object obj             = GetMaxConstraintValue(dr, constraintValue);                  //当前要取数据的最大值

            int seqNo = 0;

            if (obj == null || string.IsNullOrEmpty(obj.ToString()) || (int.TryParse(constraintValue, out seqNo) && Convert.ToInt32(obj) <= Convert.ToInt32(constraintValue)))
            {
                Console.WriteLine($"{_jobName}暂时没有需要同步的记录!当前时间{DateTime.Now}");
                dr["Status"] = 0;
                return;
            }
            Console.WriteLine($"{_jobName}开始执行,当前时间{DateTime.Now}");
            ConstraintColumnType constrainType = (ConstraintColumnType)Convert.ToInt32(dr["ConstraintType"]);
            string        viewName             = dr["ViewName"].ToString();             //源数据库视图名称
            string        constraintColumnName = dr["ConstraintColumnName"].ToString(); //约束列名称
            string        conn          = dr["SourceConnString"].ToString();            //源数据库连接字符串
            string        batchCount    = dr["BatchCount"].ToString();                  //批量处理记录数或者间隔
            int           reTryCount    = Convert.ToInt32(dr["ReTryCount"]);            //重试次数
            int           reTryInterval = Convert.ToInt32(dr["ReTryInterval"]);         //重试间隔
            DataBaseClass databaseClass = (DataBaseClass)Convert.ToInt32(dr["SourceType"]);

            StringBuilder builder = new StringBuilder();

            builder.Append("select * from ");
            builder.Append(viewName);

            switch (constrainType)
            {
            case ConstraintColumnType.日期时间列:
                builder.Append(" where ");
                builder.Append(constraintColumnName);
                builder.Append(">");
                builder.Append(FillStringBuilder(databaseClass, constraintValue));
                builder.Append(" and ");
                builder.Append(constraintColumnName);
                builder.Append("<=");
                _endSyncNo = Convert.ToDateTime(obj).ToString("yyyy-MM-dd HH:mm:ss:fff");
                builder.Append(FillStringBuilder(databaseClass, _endSyncNo));
                break;

            case ConstraintColumnType.自增长列:
                builder.Append(" where ");
                builder.Append(constraintColumnName);
                builder.Append(">");
                builder.Append(constraintValue);
                builder.Append(" and ");
                builder.Append(constraintColumnName);
                builder.Append("<=");
                int count = Convert.ToInt32(constraintValue) + Convert.ToInt32(batchCount);
                if (count > Convert.ToInt32(obj))
                {
                    count = Convert.ToInt32(obj);
                }
                _endSyncNo = count.ToString();
                builder.Append(count);
                break;

            default:
                break;
            }

            string sql = builder.ToString();

            SqlHelper helper = new SqlHelper(conn, databaseClass);

            DataTable dt = null;

            for (int i = 0; i < reTryCount; i++)
            {
                if (dt == null)
                {
                    try
                    {
                        dt = helper.GetData(sql);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        Thread.Sleep(reTryInterval);
                    }
                }
            }

            BulkCopy(dt);

            UpdateConfig(dr);

            //修改为未执行状态
            dr["Status"] = 0;


            Console.WriteLine($"{_jobName}执行结束,当前时间{DateTime.Now}");
        }
Пример #2
0
        //获取最大的约束值假设A,要轮询得区间为(B,C]
        //如果A<C,则轮询得空间缩小为(B,A]
        public object GetMaxConstraintValue(DataRow dr, string constraintValue)
        {
            if (dr == null)
            {
                return(null);
            }

            string viewName                    = dr["ViewName"].ToString();
            string constraintColumnName        = dr["ConstraintColumnName"].ToString();
            int    batchCount                  = Convert.ToInt32(dr["BatchCount"]);
            int    reTryCount                  = Convert.ToInt32(dr["ReTryCount"]);    //重试次数
            int    reTryInterval               = Convert.ToInt32(dr["ReTryInterval"]); //重试间隔
            ConstraintColumnType constrainType = (ConstraintColumnType)Convert.ToInt32(dr["ConstraintType"]);
            DataBaseClass        databaseClass = (DataBaseClass)Convert.ToInt32(dr["SourceType"]);
            StringBuilder        sb            = new StringBuilder();

            sb.Append("select max(");
            sb.Append(constraintColumnName);
            sb.Append(") from ");

            switch (constrainType)
            {
            case ConstraintColumnType.日期时间列:
                sb.Append(" (select top ");
                sb.Append(batchCount);
                sb.Append(" ");
                sb.Append(constraintColumnName);
                sb.Append("  from ");
                sb.Append(viewName);
                sb.Append(" where ");
                sb.Append(constraintColumnName);
                sb.Append(">");
                sb.Append(FillStringBuilder(databaseClass, constraintValue));
                sb.Append(" order by ");
                sb.Append(constraintColumnName);
                sb.Append(" ) as TempTable");
                break;

            case ConstraintColumnType.自增长列:
                sb.Append(viewName);
                sb.Append(" where ");
                sb.Append(constraintColumnName);
                sb.Append(">");
                sb.Append(constraintValue);
                break;

            default:
                sb.Append(" 1=1 ");
                break;
            }
            string sql = sb.ToString();

            string conn = dr["SourceConnString"].ToString();

            SqlHelper helper = new SqlHelper(conn, databaseClass);

            object max = null;

            for (int i = 0; i < reTryCount; i++)
            {
                if (max == null)
                {
                    try
                    {
                        max = helper.GetMax(sql);
                        break;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        Thread.Sleep(reTryInterval);
                    }
                }
            }

            return(max);
        }