/// <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()); }
public List <SimpDataEntery> GetBaseTable(string tableName, object editTime, object schemaMD5, object contentsMD5) { RefreshBaseTable(tableName); bool isContentsMD5Equals; //用来记录 判断客户端数据与服务端是否相同 DataTable _dt = GetBaseTableByCacheDataSets(tableName, editTime, schemaMD5, contentsMD5, out isContentsMD5Equals); //获取更新记录集 string _clientDelKeys = GetDeleteKeysString(tableName, editTime); //获取被删除记录 主键字符串 bool _hasNew = (_dt != null && _dt.Rows.Count > 0); bool _hasDelete = !_clientDelKeys.Equals(string.Empty); if (!_hasNew && //不存在需要更新数据 !_hasDelete && isContentsMD5Equals) //用来判断客户端数据与服务端是否相同 (客户端数据不准确情况下会出现 _hasNew=true _hasDelete=true的情况) { return(null); } List <SimpDataEntery> _lisSimp = new List <SimpDataEntery>(); SimpDataEntery _schemaEty, _deleteEty, _contentEty; _schemaEty = _deleteEty = _contentEty = null; if (_hasDelete) { _deleteEty = new SimpDataEntery() { Cols = new SimpDataColInf[] { new SimpDataColInf() { name = DELETE_IDS_COLNAME, type = DotNetType.String } }, Rows = new List <object[]>() { new object[] { _clientDelKeys } }, TVal = System.DateTime.Now.Ticks }; } _schemaEty = TableChgLog.GetBaseTableChangInfo(tableName);//不管有没有必须近观回。需要返回MD5等信息 if (_hasNew) { _contentEty = SimpDataConvertHelper.DataTableToSimpDataEntery(_dt); } _lisSimp.Add(_schemaEty); _lisSimp.Add(_deleteEty); _lisSimp.Add(_contentEty); return(_lisSimp); }
/// <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; } }