1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#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;
        }
    }
}