/// <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); } }