示例#1
0
        /// <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());
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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;
            }
        }