Пример #1
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);
            }
        }