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
using System;
using System.Text;
 
namespace CSFramework.DB
{
    /// <summary>
    /// 数据库对象工厂
    /// </summary>
    public static class DatabaseFactory
    {
        /// <summary>
        /// 执行SQL命令超时时间,单位:秒。当未设置此参数(默认0),DbCommand默认TimeOut值,30秒。
        /// </summary>
        public static int CommandTimeOut { get; set; } = 30;
 
        /// <summary>
        /// 连接数据库服务器超时时间,单位:秒。当未设置此参数(默认0),DbConnection默认TimeOut值,15秒。
        /// </summary>
        public static int ConnectionTimeOut { get; set; } = 15;
 
        /// <summary>
        /// 创建数据库(使用DataProviderFactory创建数据存取基础组件,通用版)
        /// </summary>
        /// <param name="providerType">数据库类型</param>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <returns></returns>
        public static IDatabase CreateMDB(DatabaseType providerType,
            string connectionString)
        {
            SetTimeOut(ref connectionString, ConnectionTimeOut);
            return new DatabaseMDB(providerType, connectionString);
        }
 
        /// <summary>
        /// 创建SQL Server数据库
        /// </summary>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <returns></returns>
        public static IDatabase CreateSqlDatabase(string connectionString)
        {
            SetTimeOut(ref connectionString, ConnectionTimeOut);
            return new DatabaseMSSQL(connectionString);
        }
 
        /// <summary>
        /// 创建MySQL数据库
        /// </summary>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <returns></returns>
        public static IDatabase CreateMySqlDatabase(string connectionString)
        {
            SetTimeOut(ref connectionString, ConnectionTimeOut);
            return new DatabaseMySQL(connectionString);
        }
 
        /// <summary>
        /// 创建Oracle数据库
        /// </summary>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <returns></returns>
        public static IDatabase CreateOracleDatabase(string connectionString)
        {
            return new DatabaseOracle(connectionString);
        }
 
        /// <summary>
        /// 创建数据库
        /// </summary>
        /// <param name="dbType">数据库类型</param>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <returns></returns>
        public static IDatabase CreateDatabase(DatabaseType dbType,
            string connectionString)
        {
            if (dbType == DatabaseType.SqlServer)
            {
                SetTimeOut(ref connectionString, ConnectionTimeOut);
                return new DatabaseMSSQL(connectionString);
            }
 
            if (dbType == DatabaseType.MySQL)
            {
                SetTimeOut(ref connectionString, ConnectionTimeOut);
                return new DatabaseMySQL(connectionString);
            }
 
            if (dbType == DatabaseType.Oracle)
                return new DatabaseOracle(connectionString);
 
            throw new Exception("未支持的数据库类型!");
        }
 
        /// <summary>
        /// 创建数据库
        /// </summary>
        /// <param name="dbType">数据库类型</param>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <returns></returns>
        public static IDatabase CreateDatabase(string dbType,
            string connectionString)
        {
            SetTimeOut(ref connectionString, ConnectionTimeOut);
            DatabaseType databaseType;
            if (!Enum.TryParse<DatabaseType>(dbType, true, out databaseType))
                throw new Exception("不支持的数据库类型!");
 
            if (databaseType == DatabaseType.SqlServer)
                return new DatabaseMSSQL(connectionString);
            if (databaseType == DatabaseType.MySQL)
                return new DatabaseMySQL(connectionString);
            if (databaseType == DatabaseType.Oracle)
                return new DatabaseOracle(connectionString);
            throw new Exception("未支持的数据库类型!");
        }
 
        /// <summary>
        /// ADO组件工厂
        /// </summary>
        /// <param name="dbType">数据库类型</param>
        /// <param name="connectionString">数据连接字符串</param>
        /// <returns></returns>
        public static IAdoFactory GetADOFactory(DatabaseType dbType,
            string connectionString)
        {
            SetTimeOut(ref connectionString, ConnectionTimeOut);
            return CreateDatabase(dbType, connectionString);
        }
 
        /// <summary> 
        /// 更改连接字符串的超时时间(适用MsSQL,MySQL) 
        /// </summary> 
        /// <param name="sConn">连接字符串</param> 
        /// <param name="TIME_OUT">超时时间,秒</param> 
        internal static void SetTimeOut(ref string sConn, int TIME_OUT)
        {
            //连接字符串没有定义Connection TimeOut
            if (sConn.ToLower().IndexOf("Connection TimeOut".ToLower(), 0) <= 0)
            {
                sConn = sConn + ";Connection TimeOut=" + TIME_OUT.ToString() +
                        ";";
            }
            else
            {
                //分隔
                var items = sConn.Split(new char[] { ';' },
                    StringSplitOptions.RemoveEmptyEntries);
                //string item = items.Where(e => e.ToLower().IndexOf("Connection TimeOut".ToLower(), 0) >= 0).FirstOrDefault();
 
                for (var i = 0; i <= items.Length - 1; i++)
                {
                    var s = items[i];
                    //;Connection TimeOut={4}; 
                    if (s.ToLower()
                            .IndexOf("Connection TimeOut".ToLower(), 0) >= 0)
                    {
                        var t = s.Split('=');
                        items[i] = "Connection TimeOut=" + TIME_OUT.ToString();
                    }
                }
 
                var sb = new StringBuilder();
                foreach (var s in items) sb.Append(s + ";");
                sConn = sb.ToString();
            }
        }
    }
}