#region using System; using System.Collections.Generic; using CSFramework.DB; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.Core.DataSetLib; using CSFrameworkV5.Models; #endregion namespace CSFrameworkV5.DataAccess { /***************************************************************************** 重要记录: 1. LoadSystemDatabase(IWriteSQLConfigValue config),根据配置文件加载系统数据库连接 2. LoadDatabase(string DBIDs),获取当前用户的账套信息,实例化DataSetConfigList对象。 3. GetDatabase(string DBID),获取数据库连接对象IDatabase. *****************************************************************************/ /// /// 数据库提供者(DAL层应用) /// public static class DatabaseProvider { private static IDataSetData _DataSetConfigList; //账套连接字符串列表 private static Dictionary _ConnectionString = new Dictionary(); //活动数据库列表 private static Dictionary _ActivedDBs = new Dictionary(); /// /// 静态构造器 /// static DatabaseProvider() { } /// /// 账套列表 /// public static IDataSetData DataSetConfigList { get => _DataSetConfigList; set { _DataSetConfigList = value; //实例化每个账套的数据库对象 foreach (var item in _DataSetConfigList.DataSets) AddDatabase(item); } } /// /// 是否IP直连模式(LAN,WAN) /// 若是WCF连接,此值必须设置为False /// public static bool IsAdoDirect { get; set; } /// /// 直连模式支持两种IP连接方式,外网IP和局域网IP, true:局域网IP, false:外网IP /// 若是WCF连接,此值必须设置为False /// public static bool IsLocalConnection { get; set; } /// /// 系统数据库 /// public static IDatabase SystemDatabase { get; private set; } /// /// 系统数据库类型 /// public static DatabaseType SystemDatabaseType { get; set; } public static void AddDatabase(DataSetConfigItem item) { if (item == null) return; if (!_ActivedDBs.ContainsKey(item.DataSetID)) { string conn; var db = DatabaseFactory.CreateDatabase(item.DatabaseType, ""); if (IsLocalConnection) conn = db.BuildConnectionString(item.LocalServerIP, item.LocalServerPort, item.DBName, item.DBUserName, item.DBUserPassword); else conn = db.BuildConnectionString(item.RemoteServerIP, item.RemoteServerPort, item.DBName, item.DBUserName, item.DBUserPassword); db.ConnectionString = conn; _ActivedDBs[item.DataSetID] = db; //数据库实例缓存表 _ConnectionString[item.DataSetID] = conn; //连接字符串缓存表 } } /// /// 获取数据库实例 /// /// 账套编号 /// public static IDatabase GetDatabase(string DBID) { if (string.IsNullOrEmpty(DBID)) return null; if (!_ConnectionString.ContainsKey(DBID)) return null; if (!_ActivedDBs.ContainsKey(DBID)) { var databaseType = DataSetConfigList.GetConfig(DBID).DatabaseType; var db = DatabaseFactory.CreateDatabase(databaseType, _ConnectionString[DBID]); //OK _ActivedDBs.Add(DBID, db); } return _ActivedDBs[DBID]; } /// /// 获取数据库实例 /// /// 数据库名称 /// public static IDatabase GetDatabaseByDbName(string DBName) { if (DBName == Globals.DEF_SYSTEM_DBName) return SystemDatabase; var item = DataSetConfigList.DataSets.Find( delegate(DataSetConfigItem p) { return p.DBName.ToLower() == DBName.ToLower(); }); if (item == null) throw new Exception($"数据库名称:{DBName}没有对应的账套!"); return GetDatabase(item.DataSetID); } /// /// 加载账套数据库,(用户登录成功后 --> 则加载当前用户拥有权限的账套) /// /// 一个或多个账套编号(多个编号用逗号分开),传空值则加载全部账套 public static void LoadDatabase(string DBIDs) { var sp = SystemDatabase.CreateSqlProc("sp_sys_GetDataSet"); sp.AddParam("DBIDs", DBIDs); var dt = SystemDatabase.GetTable(sp.Command, tb_DataSet.__TableName); //第一次加载数据账套表 if (DataSetConfigList == null) { DataSetConfigList = new DataSetData(dt); } else //添加数据库 { var ds = new DataSetData(dt); var dbs = DBIDs.Split(','); if (dbs.Length > 0) AddDatabase(ds.GetConfig(dbs[0])); } } /// /// 系统初始化时 --> 加载系统数据库 /// /// public static void LoadSystemDatabase(IWriteSQLConfigValue config) { //创建系统数据库实例 SystemDatabaseType = (DatabaseType)Enum.Parse(typeof(DatabaseType), config.DatabaseType); SystemDatabase = DatabaseFactory.CreateDatabase(SystemDatabaseType, config.ConnectionString); //添加缓存 _ConnectionString[Globals.DEF_SYSTEM_DBID] = config.ConnectionString; _ActivedDBs[Globals.DEF_SYSTEM_DBID] = SystemDatabase; } /// /// 系统初始化时 --> 加载系统数据库 /// /// public static void LoadSystemDatabase(DatabaseType databaseType, string connectionString) { //创建系统数据库实例 SystemDatabaseType = databaseType; SystemDatabase = DatabaseFactory.CreateDatabase(databaseType, connectionString); //添加缓存 _ConnectionString[Globals.DEF_SYSTEM_DBID] = connectionString; _ActivedDBs[Globals.DEF_SYSTEM_DBID] = SystemDatabase; } } }