Exemplo n.º 1
0
        protected override IEnumerable <VHISPLANINFO> GetDataFromSourdeDb(OracleTableMaxId maxId)
        {
            var type          = typeof(VHISPLANINFO);
            var specialColumn = "MOBILENUMBER4";
            var selectColumns = string.Join(",", type.GetProperties().Select(p => p.Name))
                                .Replace(specialColumn, $"ROWNUM AS {specialColumn}");
            var condition = maxId == null ? string.Empty : $"WHERE {specialColumn}>{maxId.MaxId}";
            var sql       = $"SELECT * FROM (SELECT {selectColumns} FROM {nameof(VHISPLANINFO)}) {condition}";

            return(OracleBaseBll.QueryBySql(sql));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 从数据源中获取新增的数据,默认以主键Id大于缓存的最大Id为查询条件
        /// 若子类需要以其它条件查询数据则可重写此方法
        /// </summary>
        /// <param name="maxId">包含上次查询的最大Id的<see cref="Guoli.Model.OracleTableMaxId"></see>实体对象/></param>
        /// <returns>查询到的新增数据集合</returns>
        protected virtual IEnumerable <TOracle> GetDataFromSourdeDb(OracleTableMaxId maxId)
        {
            var condition = string.Empty;

            if (maxId != null)
            {
                condition = $"to_number({OracleTablePrimaryKeyName})>'{maxId.MaxId}'";
            }

            return(OracleBaseBll.QueryList(condition));
        }
Exemplo n.º 3
0
        /// <summary>
        /// 实现更新数据源中被修改过的数据
        /// </summary>
        public void UpdateEditedData()
        {
            try
            {
                var watch = new Stopwatch();
                watch.Start();

                var counter = 0;

                #region 执行数据同步
                Logger.Info($"正在执行同步表 {OracleTableName} 中被更新过的数据");
                if (!NeedToUpdateAll)
                {
                    Logger.Info($"由于表 {OracleTableName} 配置了 {nameof(NeedToUpdateAll)} 的值为false,因此跳过同步数据操作");
                    return;
                }

                // 获取关系缓存中与待更新表有关的数据
                Logger.Info($"正在执行从缓存中获取与表 {OracleTableName} 所对应的主键关系");
                var relations = CacheManager.PrimaryIdCache.Where(item => item.OracleTableName == OracleTableName);

                Logger.Info("正在执行逐条对比源数据与目标数据的差异性");

                foreach (var relation in relations)
                {
                    // 逐条对比oracle与sqlserver中的数据有无变化
                    dynamic oracleModel    = OracleBaseBll.QuerySingle((object)relation.OraclePrimaryId);
                    dynamic sqlserverModel = SqlserverBaseBll.QuerySingle((object)relation.SqlPrimaryId);

                    if (oracleModel == null)
                    {
                        // 数据源中该数据被删除,目前暂时忽略
                    }
                    else
                    {
                        if (HasEdited(oracleModel, sqlserverModel))
                        {
                            // 数据源中的数据被修改过
                            UpdateSqlserverModel(oracleModel, sqlserverModel);

                            Func <bool> updateTransaction = () =>
                            {
                                var success = SqlserverBaseBll.Update(sqlserverModel);
                                if (success)
                                {
                                    // 将数据更新同步到数据更新日志表中
                                    DataUpdateLog.SingleUpdate(SqlserverTableName, Convert.ToInt32(sqlserverModel.Id), DataUpdateType.Update);
                                    return(true);
                                }

                                return(false);
                            };

                            // 执行数据同步
                            var syncSuccess = SqlserverBaseBll.ExecuteTransation(updateTransaction);
                            if (syncSuccess)
                            {
                                counter++;
                            }
                        } // end if
                    }     // end else
                }         // end foreach
                #endregion

                watch.Stop();
                Logger.Info($"本次同步数据结束,共检查 {relations.Count()} 条数据,其中有 {counter} 条数据被更新,共耗时 {watch.Elapsed}");
            }
            catch (Exception ex)
            {
                Logger.Error($"在执行同步表 {OracleTableName} 的数据更新时发生异常", ex);
            }
        }