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