#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.
|
|
*****************************************************************************/
|
|
/// <summary>
|
/// 数据库提供者(DAL层应用)
|
/// </summary>
|
public static class DatabaseProvider
|
{
|
private static IDataSetData _DataSetConfigList;
|
|
//账套连接字符串列表
|
private static Dictionary<string, string> _ConnectionString =
|
new Dictionary<string, string>();
|
|
//活动数据库列表<string:DBID账套编号,IDatabase:数据库实例>
|
private static Dictionary<string, IDatabase> _ActivedDBs =
|
new Dictionary<string, IDatabase>();
|
|
/// <summary>
|
/// 静态构造器
|
/// </summary>
|
static DatabaseProvider()
|
{
|
}
|
|
/// <summary>
|
/// 账套列表
|
/// </summary>
|
public static IDataSetData DataSetConfigList
|
{
|
get => _DataSetConfigList;
|
set
|
{
|
_DataSetConfigList = value;
|
|
//实例化每个账套的数据库对象
|
foreach (var item in _DataSetConfigList.DataSets)
|
AddDatabase(item);
|
}
|
}
|
|
/// <summary>
|
/// 是否IP直连模式(LAN,WAN)
|
/// 若是WCF连接,此值必须设置为False
|
/// </summary>
|
public static bool IsAdoDirect { get; set; }
|
|
/// <summary>
|
/// 直连模式支持两种IP连接方式,外网IP和局域网IP, true:局域网IP, false:外网IP
|
/// 若是WCF连接,此值必须设置为False
|
/// </summary>
|
public static bool IsLocalConnection { get; set; }
|
|
/// <summary>
|
/// 系统数据库
|
/// </summary>
|
public static IDatabase SystemDatabase { get; private set; }
|
|
/// <summary>
|
/// 系统数据库类型
|
/// </summary>
|
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; //连接字符串缓存表
|
}
|
}
|
|
/// <summary>
|
/// 获取数据库实例
|
/// </summary>
|
/// <param name="DBID">账套编号</param>
|
/// <returns></returns>
|
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];
|
}
|
|
/// <summary>
|
/// 获取数据库实例
|
/// </summary>
|
/// <param name="DBName">数据库名称</param>
|
/// <returns></returns>
|
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);
|
}
|
|
/// <summary>
|
/// 加载账套数据库,(用户登录成功后 --> 则加载当前用户拥有权限的账套)
|
/// </summary>
|
/// <param name="DBIDs">一个或多个账套编号(多个编号用逗号分开),传空值则加载全部账套</param>
|
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]));
|
}
|
}
|
|
/// <summary>
|
/// 系统初始化时 --> 加载系统数据库
|
/// </summary>
|
/// <param name="config"></param>
|
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;
|
}
|
|
/// <summary>
|
/// 系统初始化时 --> 加载系统数据库
|
/// </summary>
|
/// <param name="connectionString"></param>
|
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;
|
}
|
}
|
}
|