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