#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
}
}