#region using System; using System.Data; using CSFrameworkV5.Business.BLL_Permission; using CSFrameworkV5.CodeGeneratorCore; using CSFrameworkV5.Core; using CSFrameworkV5.Models; using ConvertEx = CSFrameworkV5.Common.ConvertEx; using DataConverter = CSFrameworkV5.Common.DataConverter; using Globals = CSFrameworkV5.Common.Globals; #endregion namespace CSFrameworkV5.Business { ///*************************************************************************/ ///* ///* 文件名 :DataDictCache.cs /// ///* 程序说明 : 数据字典缓存数据 /// ///* 原创作者 :www.csframework.com ///* Copyright 2010-2012 ///* ///**************************************************************************/ /* 数据字典缓存数据,如系统数据,公共数据,或Lookup组件数据源. */ public class DataDictCache : IDataCacheBase { protected DataSet _CachedTables; /*私有构造器,不允许外部创建实例*/ protected DataDictCache() { _CachedTables = new DataSet(); DataCacheMgr.Instance.AddCache(this); //托管 } public DataTable CustomerAttributes { get { var dt = FindFromCache("tb_CustomerAttribute"); if (dt == null) { dt = CommonData.GetDataDict("tb_CustomerAttribute"); AddToCache(dt.Copy()); } return dt; } } public DataTable DataSet { get { var dt = FindFromCache(tb_DataSet.__TableName); if (dt == null) { dt = CommonData.GetSystemDataSet(); AddToCache(dt.Copy()); } return dt; } } public DataTable LanguageType { get { var dt = FindFromCache("sys_LanguageType"); if (dt == null) { dt = new bllLanguage().GetTypeData(); AddToCache(dt.Copy()); } return dt; } } /// /// 系统单据列表 /// [CG_LookupDataSourceAttribute("单据名称表")] public DataTable sys_DocName { get { var dt = FindFromCache("sys_DocName"); if (dt == null) { dt = CommonData.GetDataDict("sys_DocName"); dt.TableName = "sys_DocName"; AddToCache(dt.Copy()); } return dt; } } #region Cache - 缓存管理器唯一实例 private static DataDictCache _Cache; /// /// 缓存数据唯一实例 /// public static DataDictCache Cache { get { if (_Cache == null) _Cache = new DataDictCache(); return _Cache; } } #endregion #region RefreshCache - 外部使用的静态方法 /// /// 刷新缓存数据,清空缓存表.在使用某项数据时从数据库取数. 清空缓存数据及缓存的数据集 /// public void RefreshCache() { _CachedTables.Tables.Clear(); GC.Collect(); } /// /// 刷新单个数据字典 /// /// 字典表名 public static void RefreshCache(string tableName, DataDictCache cacheInstance = null) { if (cacheInstance == null) cacheInstance = Cache; var cache = cacheInstance.FindFromCache(tableName); if (cache != null) //有客户窗体引用缓存数据时才更新 { var data = CommonData.GetDataDict(tableName); if (data != null) { cache.Rows.Clear(); foreach (DataRow row in data.Rows) cache.ImportRow(row); cache.AcceptChanges(); } } } #endregion #region 1.系统数据库的缓存数据 [CG_LookupDataSourceAttribute("业务单据表")] public DataTable BusinessTables { get { var dt = FindFromCache("SysBusinessTables"); if (dt == null) { dt = CommonData.GetDataDict(Globals.DEF_SYSTEM_DBID, sys_BusinessTables.__TableName); dt.TableName = "SysBusinessTables"; AddToCache(dt.Copy()); } return dt; } } [CG_LookupDataSourceAttribute("用户资料")] public DataTable User { get { var dt = FindFromCache(tb_MyUser.__TableName); if (dt == null) { dt = new bllUser().GetLookupData(); AddLookupText(dt, tb_MyUser.Account, tb_MyUser.UserName, CommonFields.LookupDisplayText); AddToCache(dt.Copy()); } return dt; } } [CG_LookupDataSourceAttribute("组织机构(用户组)数据")] public DataTable UserGroup { get { var dt = FindFromCache(tb_MyGroup.__TableName); if (dt == null) { dt = new bllGroup().GetLookupData(); AddToCache(dt.Copy()); } return dt; } } #endregion #region 方法 /// /// 加到缓存的数据集 /// /// public void AddToCache(DataTable dt) { _CachedTables.Tables.Add(dt); } /// /// 查找缓存表 /// /// 指定表名 /// public DataTable FindFromCache(string tableName) { return _CachedTables.Tables[tableName]; } /// /// 同步新增或修改缓存数据某一条记录 /// /// 最新资料 /// 操作类型(新增/修改) /// 字典表名 /// 主键 public void SyncAddOrUpdateCache(DataRow newlyRow, UpdateType type, string tableName, string keyField) { if (type == UpdateType.Add) //同步新增 { var cache = FindFromCache(tableName); if (cache != null) { var newRow = cache.NewRow(); //缓存数据新增一条记录 DataConverter.ReplaceDataRowChanges(newlyRow, newRow); //替换数据 cache.Rows.Add(newRow); cache.AcceptChanges(); } } else if (type == UpdateType.Modify) //同步修改 { var cache = FindFromCache(tableName); if (cache != null) { var key = ConvertEx.ToString(newlyRow[keyField]); var rows = cache.Select(keyField + "='" + key + "'"); //找到缓存数据的记录 if (rows.Length > 0) { DataConverter.ReplaceDataRowChanges(newlyRow, rows[0]); //替换数据 cache.AcceptChanges(); } } } } /// /// 同步新增一条记录到缓存数据 /// /// 字典表名 /// 主键 /// 主键值 /// 最新资料 public void SyncAddCacheRow(string tableName, string keyField, string key, DataRow newlyRow) { var cache = FindFromCache(tableName); if (cache != null) { var newRow = cache.NewRow(); //缓存数据新增一条记录 DataConverter.ReplaceDataRowChanges(newlyRow, newRow); //替换数据 cache.Rows.Add(newRow); } cache.AcceptChanges(); } /// /// 同步删除缓存数据某一条记录 /// /// 字典表名 /// 主键 /// 主键值 public void SyncDeleteCacheRow(string tableName, string keyField, string key) { var cache = FindFromCache(tableName); if (cache != null) { var rows = cache.Select(keyField + "='" + key + "'"); //找到缓存数据的记录 if (rows.Length > 0) cache.Rows.Remove(rows[0]); cache.AcceptChanges(); } } /// /// 同步更新缓存数据某一条记录 /// /// 字典表名 /// 主键 /// 主键值 /// 最新资料 public void SyncUpdateCacheRow(string tableName, string keyField, string key, DataRow newlyRow) { var cache = FindFromCache(tableName); if (cache != null) { var rows = cache.Select(keyField + "='" + key + "'"); //找到缓存数据的记录 if (rows.Length > 0) { DataConverter.ReplaceDataRowChanges(newlyRow, rows[0]); //替换数据 cache.AcceptChanges(); } } } /// /// 存在某项值 /// /// 资料表 /// 字段名 /// 值 /// public static bool IsExists(DataTable cache, string fieldName, string value) { var rows = cache.Select(fieldName + "='" + value + "'"); return rows.Length > 0; } /// /// 取值 /// /// 资料表 /// 主键 /// 返回指定字段的值 /// 对应主键的值 /// public static string GetValue(DataTable cache, string keyFieldName, string returnField, string value) { var rows = cache.Select(keyFieldName + "='" + value + "'"); if (rows.Length > 0) return ConvertEx.ToString(rows[0][returnField]); return ""; } /// /// 增加一个Lookup组件显示文本用的字段。 /// /// 资料表 /// 编号字段名 /// 名称字段名 /// Lookup显示文本来源字段 public void AddLookupText(DataTable data, string codeField, string nameField, string displayField) { //显示内容:Code - Name if (data.Columns[displayField] == null) data.Columns.Add(displayField, typeof(string)); foreach (DataRow row in data.Rows) row[displayField] = ConvertEx.ToString(row[codeField]) + " - " + ConvertEx.ToString(row[nameField]); data.AcceptChanges(); } #endregion } }