#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;
|
}
|
}
|
|
/// <summary>
|
/// 系统单据列表
|
/// </summary>
|
[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;
|
|
/// <summary>
|
/// 缓存数据唯一实例
|
/// </summary>
|
public static DataDictCache Cache
|
{
|
get
|
{
|
if (_Cache == null) _Cache = new DataDictCache();
|
|
return _Cache;
|
}
|
}
|
|
#endregion
|
|
#region RefreshCache - 外部使用的静态方法
|
|
/// <summary>
|
/// 刷新缓存数据,清空缓存表.在使用某项数据时从数据库取数. 清空缓存数据及缓存的数据集
|
/// </summary>
|
public void RefreshCache()
|
{
|
_CachedTables.Tables.Clear();
|
GC.Collect();
|
}
|
|
/// <summary>
|
/// 刷新单个数据字典
|
/// </summary>
|
/// <param name="tableName">字典表名</param>
|
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 方法
|
|
/// <summary>
|
/// 加到缓存的数据集
|
/// </summary>
|
/// <param name="dt"></param>
|
public void AddToCache(DataTable dt)
|
{
|
_CachedTables.Tables.Add(dt);
|
}
|
|
/// <summary>
|
/// 查找缓存表
|
/// </summary>
|
/// <param name="tableName">指定表名</param>
|
/// <returns></returns>
|
public DataTable FindFromCache(string tableName)
|
{
|
return _CachedTables.Tables[tableName];
|
}
|
|
/// <summary>
|
/// 同步新增或修改缓存数据某一条记录
|
/// </summary>
|
/// <param name="newlyRow">最新资料</param>
|
/// <param name="type">操作类型(新增/修改)</param>
|
/// <param name="tableName">字典表名</param>
|
/// <param name="keyField">主键</param>
|
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();
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 同步新增一条记录到缓存数据
|
/// </summary>
|
/// <param name="tableName">字典表名</param>
|
/// <param name="keyField">主键</param>
|
/// <param name="key">主键值</param>
|
/// <param name="newlyRow">最新资料</param>
|
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();
|
}
|
|
/// <summary>
|
/// 同步删除缓存数据某一条记录
|
/// </summary>
|
/// <param name="tableName">字典表名</param>
|
/// <param name="keyField">主键</param>
|
/// <param name="key">主键值</param>
|
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();
|
}
|
}
|
|
/// <summary>
|
/// 同步更新缓存数据某一条记录
|
/// </summary>
|
/// <param name="tableName">字典表名</param>
|
/// <param name="keyField">主键</param>
|
/// <param name="key">主键值</param>
|
/// <param name="newlyRow">最新资料</param>
|
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();
|
}
|
}
|
}
|
|
/// <summary>
|
/// 存在某项值
|
/// </summary>
|
/// <param name="cache">资料表</param>
|
/// <param name="fieldName">字段名</param>
|
/// <param name="value">值</param>
|
/// <returns></returns>
|
public static bool IsExists(DataTable cache, string fieldName,
|
string value)
|
{
|
var rows = cache.Select(fieldName + "='" + value + "'");
|
return rows.Length > 0;
|
}
|
|
/// <summary>
|
/// 取值
|
/// </summary>
|
/// <param name="cache">资料表</param>
|
/// <param name="keyFieldName">主键</param>
|
/// <param name="returnField">返回指定字段的值</param>
|
/// <param name="value">对应主键的值</param>
|
/// <returns></returns>
|
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 "";
|
}
|
|
/// <summary>
|
/// 增加一个Lookup组件显示文本用的字段。
|
/// </summary>
|
/// <param name="data">资料表</param>
|
/// <param name="codeField">编号字段名</param>
|
/// <param name="nameField">名称字段名</param>
|
/// <param name="lookupField">Lookup显示文本来源字段</param>
|
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
|
}
|
}
|