示例#1
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;
            }
        }