/// <summary> /// 根据更新时间获取 更新数据 /// 在RefreshBaseTable 后调用 /// </summary> /// <param name="tableName"></param> /// <param name="editTime"></param> /// <returns></returns> private DataTable GetBaseTableByCacheDataSets(string tableName, object editTime, object schemaMD5, object contentsMD5, out bool isContentsMD5Equals) { object _svcChangTime, _svcSchemaMD5, _svcContentsMD5, _svcTableKey; TableChgLog.ReadLog(tableName, out _svcChangTime, out _svcTableKey, out _svcSchemaMD5, out _svcContentsMD5); bool _isSchemaMD5Equals = schemaMD5.Equals(_svcSchemaMD5); isContentsMD5Equals = contentsMD5.Equals(_svcContentsMD5); if (_isSchemaMD5Equals && isContentsMD5Equals)//结构和数据MD5相同, { return(null); } if (!_isSchemaMD5Equals || editTime.Equals(string.Empty))//结构不相同 或者更新时间为空 返回整表 { return(CacheDataSets.Tables[tableName]); } DataTable _cacheDt; ReadClientBaseTableFormDb(tableName, editTime.ToString(), out _cacheDt); //服务器数据没有Edit_Time字段,所以只能从数据库取数据 //DataTable _cacheDt = CacheDataSets.Tables[tableName]; //_cacheDt.DefaultView.RowFilter = string.Format("Edit_Time>'{0}'", editTime); return(_cacheDt.DefaultView.ToTable()); }
/// <summary> /// 根据 服务端记录的 EditTime更新 缓存数据表 然后更新MD5 根据MainKey 取MD5 /// </summary> /// <param name="tableName"></param> private void RefreshBaseTable(string tableName) { object _svcChangTime, _svcSchemaMD5, _svcContentsMD5, _svcTableKey; TableChgLog.ReadLog(tableName, out _svcChangTime, out _svcTableKey, out _svcSchemaMD5, out _svcContentsMD5); object _dbTableKey, _dbChangTime, _dbDelKeys; DataTable _dtNew, _dtDelKey; ReadBaseTableFormDb(tableName, _svcChangTime, out _dbTableKey, out _dbChangTime, out _dtDelKey, out _dtNew); AddDeleteKeyTable(tableName, _dtDelKey); _dbDelKeys = GetDeleteKeysString(tableName, _svcChangTime);//获取删除键集合 //CASE 1:缓存记录结构信息为空 //重新写入缓存, //重新写入更新信息TableChgLog bool _tableIsNull = (CacheDataSets.Tables[tableName] == null); if (_tableIsNull)//表示还未记录缓存 { InitTablePrimaryKey(_dtNew, _dbTableKey.ToString()); _dtNew.TableName = tableName; CacheDataSets.Tables.Add(_dtNew); CacheDataSets.AcceptChanges(); TableChgLog.UpdateLog(tableName, _dbChangTime, _dbTableKey, _dtNew); return; } bool _tableChgTimeIsEqual = _dbChangTime.Equals(_svcChangTime); //判断修改时间是否一至 bool _tableNotNeedDelete = _dbDelKeys.Equals(string.Empty); //判断删是否存在需要删除的记录 bool _tableKeyIsEqual = _dbTableKey.Equals(_svcTableKey); //判断主键是否一至 bool _tableSchemaIsEqual = DataTableExtend.DataTableHelper.TableColumnsEquals(_dtNew, CacheDataSets.Tables[tableName]); //判断表结构是否一至 //CASE 2:版本一至 //不需要更新 if (!_tableIsNull && //判断是否存在缓存表 **不满足CASE 1 肯定为 BaseDataSets.Tables[tableName] != nul _tableChgTimeIsEqual && //判断修改时间是否一至 _tableNotNeedDelete && //判断删是否存在需要删除的记录 _tableKeyIsEqual && //判断主键是否一至 _tableSchemaIsEqual) //判断表结构是否一至 { return; //版本一至,不需要更新 } //CASE 3:版本发生变化 //更新数据 if (!_tableSchemaIsEqual)//表结构不一至,清空缓存,重新运行RefreshBaseTable(tableName); 进入 -->CASE 1 { if (!_tableIsNull) { CacheDataSets.Tables[tableName].Dispose(); CacheDataSets.Tables.Remove(tableName); } TableChgLog.UpdateLog(tableName, string.Empty, _dbTableKey, null);//需清空 变化记录 RefreshBaseTable(tableName); return; } if (!_tableIsNull) { DataTable _cacheDt = CacheDataSets.Tables[tableName]; //记录缓存表引用 if (!_tableKeyIsEqual) //主键发生变化,更新主键 { InitTablePrimaryKey(_cacheDt, _dbTableKey.ToString()); } if (!_tableNotNeedDelete)// /删除记录发生变化 删除变删除的记录 { DataTableExtend.DataTableHelper.DeleteDataTableForFilterExpression( _cacheDt, string.Format("{0} IN ({1})", _dbTableKey, _dbDelKeys), true); } if (!_tableChgTimeIsEqual)//修改时间发生变化 加入被修改的记录 { _cacheDt.Merge(_dtNew); } _cacheDt.AcceptChanges(); TableChgLog.UpdateLog(tableName, _dbChangTime, _dbTableKey, _cacheDt);//更新缓存记录表 return; } }