策略模式实现支持多种类数据库的DBHelp(推荐--arvin)

UML系列图——类图(Class Diagram) 擂鼓备战:     类图(Class Diagram)是最常用的UML图,可以显示出类、接口、以及它们之间的静态结构和关系;用于描述软件的结构化设计,要注意的是,类图不现实暂时性信息。下面就由小编带领大家从类图的每一个构成元素开始,详细的学习下类图。 鏖战于野:     类(Class):         是由类名、属性(Attributes)、方法这三部分组成,类名不可省略,其他组成部分 阅读详情

来自:http://www.cnblogs.com/springyangwc/archive/2013/03/17/2964428.html#2636446

概述

需求

有时我们的系统需要支持多种数据库,如即要支持MSSQL server又要同时支持Oracle database.而如果我们为些实现两套数据库操作的方式,就会不能很好的达到软件设计的目标:高内聚,低偶合。

设计

采取策略模式(Strategy),它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。

1

优点:

1、 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。  
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。   
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

缺点:  
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。   
2、 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。(这本身没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化的减轻了客户端的压力。)

DBHelp设计目标,同时支持Sqlite、Oracle 、MySql 、MsSql,类UML图设计如下:

DBHelpClassDesignDiagram

有了上面的设计图如后,我们先创建Enums:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/********************************************************************************
** Class Name:   Enums
** Author:      Spring Yang
** Create date: 2013-3-16
** Modify:      Spring Yang
** Modify Date: 2013-3-16
** Summary:     Enums  class
*********************************************************************************/
namespace BlogDBHelp
{
    using System;
    [Serializable]
    public enum SqlSourceType
    {
        Oracle,
        MSSql,
        MySql,
        SQLite
    }
}

再创建IDBHelp接口:

?
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
/********************************************************************************
** Class Name:   IDBHelp
** Author:      Spring Yang
** Create date: 2013-3-16
** Modify:      Spring Yang
** Modify Date: 2013-3-16
** Summary:     IDBHelp interface
*********************************************************************************/
namespace BlogDBHelp
{
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    public interface IDBHelp
    {
        /// < summary >
        /// Gets the connection string
        /// </ summary >
        string ConnectionString { get; set; }
        /// < summary >
        /// Gets or sets the max connection count
        /// </ summary >
        int MaxConnectionCount { get; set; }
        /// < summary >
        /// Gets or sets the sql source type
        /// </ summary >
        SqlSourceType DataSqlSourceType { get; }
        /// < summary >
        /// Execute query by stored procedure
        /// </ summary >
        /// < param name = "cmdText" >stored procedure</ param >
        /// < returns >DataSet</ returns >
        DataSet ExecuteQuery(string cmdText);
        /// < summary >
        /// Execute non query by stored procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >stored procedure</ param >
        /// < returns >execute count</ returns >
        int ExecuteNonQuery(string cmdText);
        /// < summary >
        /// Execute scalar by store procedure
        /// </ summary >
        /// < param name = "cmdText" >store procedure</ param >
        /// < returns >return value</ returns >
        object ExecuteScalar(string cmdText);
        /// < summary >
        /// Get data base parameter by parameter name and parameter value
        /// </ summary >
        /// < param name = "key" >parameter name</ param >
        /// < param name = "value" >parameter value</ param >
        /// < returns >sql parameter</ returns >
        DbParameter GetDbParameter(string key, object value);
        /// < summary >
        /// Get data base parameter by parameter name and parameter value
        /// and parameter direction
        /// </ summary >
        /// < param name = "key" >parameter name</ param >
        /// < param name = "value" >parameter value</ param >
        /// < param name = "direction" >parameter direction </ param >
        /// < returns >data base parameter</ returns >
        DbParameter GetDbParameter(string key, object value, ParameterDirection direction);
        /// < summary >
        /// Read entity list by  store procedure
        /// </ summary >
        /// < typeparam name = "T" >entity</ typeparam >
        /// < param name = "cmdText" >store procedure</ param >
        /// < returns >entity list</ returns >
        List< T > ReadEntityList< T >(string cmdText) where T : new();
        /// < summary >
        /// Get dictionary result by store procedure and parameters and string list
        /// </ summary >
        /// < param name = "cmdText" >store procedure</ param >
        /// < param name = "stringlist" >string list</ param >
        /// < returns >result list</ returns >
        List< Dictionary <string, object>> GetDictionaryList(string cmdText,
                                                           List< string > stringlist);
        /// < summary >
        /// Batch execute ExecuteNonQuery by cmdText list
        /// </ summary >
        /// < param name = "cmdList" >cmd text list</ param >
        /// < returns >execute true or not</ returns >
        bool BatchExecuteNonQuery(List< string > cmdList);
    }
}

再创建AbstractDBHelp 抽象类:

?
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
/********************************************************************************
** Class Name:   AbstractDBHelp
** Author:      Spring Yang
** Create date: 2013-3-16
** Modify:      Spring Yang
** Modify Date: 2013-3-16
** Summary:     AbstractDBHelp interface
*********************************************************************************/
namespace BlogDBHelp
{
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.Common;
    using System.Reflection;
    using System.Threading;
    public abstract class AbstractDBHelp : IDBHelp
    {
        #region Private Property
        private static int _currentCount;
        private int _maxConnectionCount;
        private string _connectionString;
        #endregion
        #region Private Methods
        private void AddConnection()
        {
            if (_currentCount < MaxConnectionCount )
                _currentCount++;
            else
            {
                while (true)
                {
                    Thread.Sleep(5);
                    if (_currentCount < MaxConnectionCount)
                    {
                        _currentCount++;
                        break;
                    }
                }
            }
        }
        private void RemoveConnection()
        {
            _currentCount--;
        }
        /// <summary>
        /// Execute query by stored procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >stored procedure and parameter list</ param >
        /// < param name = "parameters" >parameter list</ param >
        /// < returns >DataSet</ returns >
        private DataSet ExecuteQuery(string cmdText, List< DbParameter > parameters)
        {
            using (var conn = GetConnection(ConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    var ds = new DataSet();
                    PrepareCommand(command, conn, cmdText, parameters);
                    var da = GetDataAdapter(command);
                    da.Fill(ds);
                    return ds;
                }
            }
        }
        /// < summary >
        /// Execute non query by stored procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >stored procedure</ param >
        /// < param name = "parameters" >parameter list</ param >
        /// < returns >execute count</ returns >
        private int ExecuteNonQuery(string cmdText, List< DbParameter > parameters)
        {
            using (var conn = GetConnection(ConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    PrepareCommand(command, conn, cmdText, parameters);
                    return command.ExecuteNonQuery();
                }
            }
        }
        public bool BatchExecuteNonQuery(List< string > cmdList)
        {
            using (var conn = GetConnection(ConnectionString))
            {
                conn.Open();
                using (var transaction = conn.BeginTransaction())
                {
                    foreach (var cmdText in cmdList)
                    {
                        if (string.IsNullOrEmpty(cmdText)) continue;
                        using (var command = conn.CreateCommand())
                        {
                            try
                            {
                                command.CommandText = cmdText;
                                command.Transaction = transaction;
                                command.ExecuteNonQuery();
                            }
                            finally
                            {
                                command.CommandText = null;
                                command.Dispose();
                            }
                        }
                    }
                    try
                    {
                        transaction.Commit();
                        return true;
                    }
                    catch
                    {
                        transaction.Rollback();
                        return false;
                    }
                    finally
                    {
                        transaction.Dispose();
                        conn.Dispose();
                        conn.Close();
                        cmdList.Clear();
                    }
                }
            }
        }
        /// < summary >
        /// Execute reader by store procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >store procedure</ param >
        /// < param name = "parameters" >parameter list</ param >
        /// < param name = "conn" >database connection </ param >
        /// < returns >data reader</ returns >
        public DbDataReader ExecuteReader(string cmdText, List< DbParameter > parameters, out DbConnection conn)
        {
            conn = GetConnection(ConnectionString);
            conn.Open();
            AddConnection();
            var command = conn.CreateCommand();
            PrepareCommand(command, conn, cmdText, parameters);
            var dataReader = command.ExecuteReader();
            RemoveConnection();
            return dataReader;
        }
        /// < summary >
        /// Execute reader by store procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >store procedure</ param >
        /// < param name = "parameters" >parameter list</ param >
        /// < returns >data reader</ returns >
        private List< T > ReadEntityList< T >(string cmdText, List< DbParameter > parameters) where T : new()
        {
            using (var conn = GetConnection(ConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    PrepareCommand(command, conn, cmdText, parameters);
                    var dataReader = command.ExecuteReader();
                    return ReadEntityListByReader< T >(dataReader);
                }
            }
        }
        /// < summary >
        /// Read entity list by reader
        /// </ summary >
        /// < typeparam name = "T" >entity</ typeparam >
        /// < param name = "reader" >data reader</ param >
        /// < returns >entity</ returns >
        private List< T > ReadEntityListByReader< T >(DbDataReader reader) where T : new()
        {
            var listT = new List< T >();
            using (reader)
            {
                while (reader.Read())
                {
                    var fileNames = new List< string >();
                    for (int i = 0; i < reader.VisibleFieldCount ; i++)
                    {
                        fileNames.Add(reader.GetName(i));
                    }
                    var inst = new T();
                    foreach (var pi in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public))
                    {
                        if (!fileNames.Exists(fileName => string.Compare(fileName, pi.Name, StringComparison.OrdinalIgnoreCase) == 0))
                            continue;
                        object obj;
                        try
                        {
                            obj = reader[pi.Name];
                        }
                        catch (Exception)
                        {
                            continue;
                        }
                        if (obj == DBNull.Value || obj == null)
                            continue;
                        var si = pi.GetSetMethod();
                        if (si == null)
                            continue;
                        if (pi.PropertyType == typeof(bool?))
                            pi.SetValue(inst, Convert.ToBoolean(obj), null);
                        else if (pi.PropertyType == typeof(string))
                            pi.SetValue(inst, obj.ToString(), null);
                        else if (pi.PropertyType == typeof(Int32))
                            pi.SetValue(inst, Convert.ToInt32(obj), null);
                        else if (pi.PropertyType == typeof(Int64))
                            pi.SetValue(inst, Convert.ToInt64(obj), null);
                        else if (pi.PropertyType == typeof(decimal))
                            pi.SetValue(inst, Convert.ToDecimal(obj), null);
                        else
                            pi.SetValue(inst, obj, null);
                    }
                    listT.Add(inst);
                }
            }
            return listT;
        }
        /// < summary >
        /// Get Dictionary list by string list
        /// </ summary >
        /// < param name = "cmdText" >Store procedure</ param >
        /// < param name = "parameters" >parameter list</ param >
        /// < param name = "stringlist" >string list</ param >
        /// < returns >result list</ returns >
        private List< Dictionary <string, object>> GetDictionaryList(string cmdText, List< DbParameter > parameters, List< string > stringlist)
        {
            using (var conn = GetConnection(ConnectionString))
            {
                AddConnection();
                using (var command = conn.CreateCommand())
                {
                    PrepareCommand(command, conn, cmdText, parameters);
                    var dataReader = command.ExecuteReader();
                    RemoveConnection();
                    return ReadStringListByReader(dataReader, stringlist);
                }
            }
        }
        /// < summary >
        /// Read dictionary list by reader and string list
        /// </ summary >
        /// < param name = "reader" >Db data reader</ param >
        /// < param name = "stringlist" >string</ param >
        /// < returns >result list</ returns >
        private List< Dictionary <string, object>> ReadStringListByReader(DbDataReader reader, List< string > stringlist)
        {
            var listResult = new List< Dictionary <string, object>>();
            using (reader)
            {
                while (reader.Read())
                {
                    var dicResult = new Dictionary< string , object>();
                    foreach (var key in stringlist)
                    {
                        if (!stringlist.Exists(fileName => string.Compare(fileName, key, StringComparison.OrdinalIgnoreCase) == 0))
                            continue;
                        object obj;
                        try
                        {
                            obj = reader[key];
                        }
                        catch (Exception)
                        {
                            continue;
                        }
                        if (obj == DBNull.Value || obj == null)
                            continue;
                        dicResult.Add(key, obj);
                    }
                    listResult.Add(dicResult);
                }
            }
            return listResult;
        }
        /// < summary >
        /// Execute scalar by store procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >store procedure</ param >
        /// < param name = "parameters" >parameter list</ param >
        /// < returns >return value</ returns >
        private object ExecuteScalar(string cmdText, List< DbParameter > parameters)
        {
            using (var conn = GetConnection(ConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    PrepareCommand(command, conn, cmdText, parameters);
                    return command.ExecuteScalar();
                }
            }
        }
        /// < summary >
        /// Prepare the execute command
        /// </ summary >
        /// < param name = "cmd" >my sql command</ param >
        /// < param name = "conn" >my sql connection</ param >
        /// < param name = "cmdText" >stored procedure</ param >
        /// < param name = "parameters" >parameter list</ param >
        private void PrepareCommand(DbCommand cmd, DbConnection conn, string cmdText, List< DbParameter > parameters)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Parameters.Clear();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            cmd.CommandType = CommandType.Text;
            cmd.CommandTimeout = 30;
            if (parameters != null)
                foreach (var parameter in parameters)
                {
                    cmd.Parameters.Add(parameter);
                }
        }
        #endregion
        #region Public Property
        public int MaxConnectionCount
        {
            get
            {
                if (_maxConnectionCount <= 0)
                    _maxConnectionCount = 100;
                return _maxConnectionCount;
            }
            set { _maxConnectionCount = value; }
        }
        public abstract SqlSourceType DataSqlSourceType { get; }
        #endregion
        #region Protected Method
        protected abstract DbDataAdapter GetDataAdapter(DbCommand command);
        protected abstract DbConnection GetConnection(string connectionString);
        #endregion
        #region Public Methods
        /// < summary >
        /// Gets the connection string
        /// </ summary >
        public string ConnectionString
        {
            get
            {
                if (_connectionString == null)
                    _connectionString = ConfigurationManager.ConnectionStrings[""].ConnectionString;
                return _connectionString;
            }
            set { _connectionString = value; }
        }
        /// < summary >
        /// Execute query by stored procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >stored procedure and parameter list</ param >
        /// < returns >DataSet</ returns >
        public DataSet ExecuteQuery(string cmdText)
        {
            try
            {
                AddConnection();
                return ExecuteQuery(cmdText, new List< DbParameter >());
            }
            finally
            {
                RemoveConnection();
            }
        }
        /// < summary >
        /// Execute non query by stored procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >stored procedure</ param >
        /// < returns >execute count</ returns >
        public int ExecuteNonQuery(string cmdText)
        {
            try
            {
                AddConnection();
                return ExecuteNonQuery(cmdText, new List< DbParameter >());
            }
            finally
            {
                RemoveConnection();
            }
        }
        /// < summary >
        /// Execute scalar by store procedure and parameter list
        /// </ summary >
        /// < param name = "cmdText" >store procedure</ param >
        /// < returns >return value</ returns >
        public object ExecuteScalar(string cmdText)
        {
            try
            {
                AddConnection();
                return ExecuteScalar(cmdText, new List< DbParameter >());
            }
            finally
            {
                RemoveConnection();
            }
        }
        /// < summary >
        /// Get data base parameter by parameter name and parameter value
        /// </ summary >
        /// < param name = "key" >parameter name</ param >
        /// < param name = "value" >parameter value</ param >
        /// < returns >my sql parameter</ returns >
        public abstract DbParameter GetDbParameter(string key, object value);
        /// < summary >
        /// Get data base parameter by parameter name and parameter value
        /// and parameter direction
        /// </ summary >
        /// < param name = "key" >parameter name</ param >
        /// < param name = "value" >parameter value</ param >
        /// < param name = "direction" >parameter direction </ param >
        /// < returns >data base parameter</ returns >
        public DbParameter GetDbParameter(string key, object value, ParameterDirection direction)
        {
            var parameter = GetDbParameter(key, value);
            parameter.Direction = direction;
            return parameter;
        }
        /// < summary >
        /// Get Dictionary list by string list
        /// </ summary >
        /// < param name = "cmdText" >Store procedure</ param >
        /// < param name = "stringlist" >string list</ param >
        /// < returns >result list</ returns >
        public List< Dictionary <string, object>> GetDictionaryList(string cmdText, List< string > stringlist)
        {
            return GetDictionaryList(cmdText, new List< DbParameter >(), stringlist);
        }
        /// < summary >
        /// Execute reader by store procedure
        /// </ summary >
        /// < param name = "cmdText" >store procedure</ param >
        /// < returns >data reader</ returns >
        public List< T > ReadEntityList< T >(string cmdText) where T : new()
        {
            try
            {
                AddConnection();
                return ReadEntityList< T >(cmdText, new List< DbParameter >());
            }
            finally
            {
                RemoveConnection();
            }
        }
        #endregion
    }
}

再创建MSSqlHelp 类:

?
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
/********************************************************************************
** Class Name:   MySqlHelp
** Author:      Spring Yang
** Create date: 2013-3-16
** Modify:      Spring Yang
** Modify Date: 2013-3-16
** Summary:     MySqlHelp class
*********************************************************************************/
namespace BlogDBHelp
{
    using System.Data.Common;
    using System.Data.SqlClient;
    public class MSSqlHelp : AbstractDBHelp
    {
        #region Protected Method
        protected override DbDataAdapter GetDataAdapter(DbCommand command)
        {
            return new SqlDataAdapter(command as SqlCommand);
        }
        protected override DbConnection GetConnection(string connectionString)
        {
            return new SqlConnection(connectionString);
        }
        #endregion
        #region Public Mehtod
        public override SqlSourceType DataSqlSourceType
        {
            get { return SqlSourceType.MSSql; }
        }
        public override DbParameter GetDbParameter(string key, object value)
        {
            return new SqlParameter(key, value);
        }
        #endregion
    }
}

再创建MySqlHelp类

?
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
/********************************************************************************
** Class Name:   MySqlHelp
** Author:      Spring Yang
** Create date: 2013-3-16
** Modify:      Spring Yang
** Modify Date: 2013-3-16
** Summary:     MySqlHelp class
*********************************************************************************/
namespace BlogDBHelp
{
    using System.Data.Common;
    using MySql.Data.MySqlClient;
    public class MySqlHelp : AbstractDBHelp
    {
        #region Protected Method
        protected override DbDataAdapter GetDataAdapter(DbCommand command)
        {
            return new MySqlDataAdapter();
        }
        protected override DbConnection GetConnection(string connectionString)
        {
            return new MySqlConnection(connectionString);
        }
        #endregion
        #region Public Mehtod
        public override DbParameter GetDbParameter(string key, object value)
        {
            return new MySqlParameter(key, value);
        }
        public override SqlSourceType DataSqlSourceType
        {
            get { return SqlSourceType.MySql; }
        }
        #endregion
    }
}

再创建OracleHelp类:

?
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
/********************************************************************************
** Class Name:   OracleHelp
** Author:      Spring Yang
** Create date: 2013-3-16
** Modify:      Spring Yang
** Modify Date: 2013-3-16
** Summary:     OracleHelp class
*********************************************************************************/
namespace BlogDBHelp
{
    using System.Data.Common;
    using Oracle.DataAccess.Client;
    public class OracleHelp : AbstractDBHelp
    {
        #region Protected Method
        protected override DbDataAdapter GetDataAdapter(DbCommand command)
        {
            return new OracleDataAdapter(command as OracleCommand);
        }
        protected override DbConnection GetConnection(string connectionString)
        {
            return new OracleConnection(connectionString);
        }
        #endregion
        #region Public Mehtod
        public override DbParameter GetDbParameter(string key, object value)
        {
            return new OracleParameter(key, value);
        }
        public override SqlSourceType DataSqlSourceType
        {
            get { return SqlSourceType.Oracle; }
        }
        #endregion
    }
}

再创建SQLiteHelp类:

?
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
/********************************************************************************
** Class Name:   SQLiteHelp
** Author:      Spring Yang
** Create date: 2013-3-16
** Modify:      Spring Yang
** Modify Date: 2013-3-16
** Summary:     SQLiteHelp class
*********************************************************************************/
namespace BlogDBHelp
{
    using System.Data.Common;
    using System.Data.SQLite;
    public class SQLiteHelp : AbstractDBHelp
    {
        #region Protected Method
        protected override DbDataAdapter GetDataAdapter(DbCommand command)
        {
            return new SQLiteDataAdapter(command as SQLiteCommand);
        }
        protected override DbConnection GetConnection(string connectionString)
        {
            return new SQLiteConnection(connectionString);
        }
        #endregion
        #region Public Mehtod
        public override DbParameter GetDbParameter(string key, object value)
        {
            return new SQLiteParameter(key, value);
        }
        public override SqlSourceType DataSqlSourceType
        {
            get { return SqlSourceType.SQLite; }
        }
        #endregion
    }
}

仔细观察上面代码,发现每增加一种数据库的支持,我们只需实现几个特有抽象方法就可以了,而调用只需像如下就可以了。

?
1
2
3
IDBHelp  _dbHelpInstance = new SQLiteHelp
                    {
                        ConnectionString ="";    };

欢迎各位参与讨论,如果觉得对你有帮助,请点击image    推荐下,万分谢谢.

作者:spring yang

出处:http://www.cnblogs.com/springyangwc/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

软件工程必备:类图(Class Diagram)从入门到精通指南 如果把软件系统比作一个“对象构成的城市”,那么类图(Class Diagram)就是这城市的地图——它用简洁的符号标注了“建筑”(类)、“道路”(关系)和“功能分区”(属性与方法),让开发者能快速看懂系统的结构与逻辑。对于软件工程来说,类图不是“可选工具”,而是需求与代码之间的桥梁:它帮产品经理理清业务边界,帮设计师规划系统架构,帮程序员避免“代码混乱”。本文将从“类图是什么”讲起,用“汽车设计图”“朋友关系”等生活化比喻拆解核心概念,通过电商系统案例演示类图的设计流程,最后探讨类图与AI结合的未来趋势。 阅读详情

相关推荐

UML建模之类图(ClassDiagram,UML图)

一、简介类是对象的集合,展示了对象的结构以及与系统的交互行为。类主要有属性(Attribute)和方法(Method)构成,属性代表对象的状态,如果属性被保存到数据库,此称之为“持久化”;方法代表对象的操作行为,类具有继承关系,可以继承于父类,也可以与其他的Class进行交互。类图展示了系统的逻辑结构,类和接口的关系。二、类的构成类主要有属性和方法构成。比如商品属性有:名称、价格、高度、宽度等;商品的方法有:计算税率,获得商品的评价等等。如下图三、类之间的关系(Relationship)关联(Association)两个相对独立的对象,当一个对象的实例与另外一个对象的特定实例存在固定关系时,这

自己动手写DB数据库框架(增)

1. 概述  在Android开发中我们经常要进行各种网络访问,比如查看各类新闻、查看各种图片。但有一种情形就是我们在规定的时间内每次重复发送的网络请求其实返回的数据可能都是一样的。比如一个电影类APP,每一次向服务器申请某个电影的相关信息,如封面、简介、演员表等等,它们的信息都是一样的,这样就有点浪费资源,最主要的是这些重复的请求产生了没有必要的流量。流量、流量、流量!!!重要的事情说三遍!而流量

z240336124的专栏 4051

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

类图(Class diagram)

类图

qq_38618691的博客 1137

在昇腾910B上,用kubeadm快速拉起一个双节点K8s集群(保姆级避坑指南)

本文详细介绍了在昇腾910B服务器上使用kubeadm快速搭建双节点Kubernetes集群的完整流程,包括环境准备、容器运行时配置、kubeadm初始化、节点加入与网络插件部署等关键步骤,特别针对ARM架构和昇腾芯片提供了优化配置和避坑指南。

weixin_29204749的博客 247

使用pytorch构建LSTM_AE模型的两种方式

2.基本LSTM_Unit计算——基本LSTM_AE结构 3.自定义LSTM_Unit计算——自定义LSTM_AE结构 1.LSTM-Encoder-Decoder模型结构及简要解析 图基本lstm计算单元

qq_37840762的博客 7275

【MarkDown】优快云 Markdown之类图classDiagram详解

类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模,也用于详细建模,将模型转换成编程代码。类图也可用于数据建模。

少莫千华 2445

基于Docker的D435i相机与IMU联合标定实战指南

本文详细介绍了基于Docker的D435i相机与IMU联合标定实战指南,涵盖kalibr镜像构建、IMU标定全流程、双目相机标定技巧及联合标定结果验证。通过Docker容器化部署,简化了复杂依赖环境,提升标定效率与精度,适用于机器人视觉与SLAM应用。

weixin_30872337的博客 239

UML复习—— UML类图(class diagram)

(3)组成要负责创建和删除其部分,(可以自己创建/删除,也可以和其他对象协作创建/删除部分)∴如果组成被销毁,其部分也必须被销毁,或者依附于其他组成。(3)【注】与领域模型不同(领域模型类图中的关联需要指明关联名称),设计类图中的关联不需要关联名称(但是有也合法)。(1)定义:类元是描述行为和结构特性的模型元素,是对众多UML元素的泛化,这些元素包括类、接口、用例和参与者。(4)特性字符串:{ordered}表示集合中的元素是有序的;类框图中,具有下划线的属性或方法表示静态(类级别)成员,而不是实例成员!

2301_78060222的博客 2637

JS逆向实战:从宿务航空机票搜索到参数签名算法解析

在现代Web应用开发中,前端与后端的数据交互安全是核心技术环节。其原理通常涉及参数签名、令牌验证等机制,用于防止未授权访问和数据篡改。这些技术的核心价值在于保障接口调用的合法性与数据完整性,广泛应用于电商、金融、旅行预订等对数据安全要求较高的场景。以机票搜索为例,网站常通过动态生成的签名参数来验证请求来源。本文以宿务太平洋航空为案例,深入解析其搜索请求中关键参数(如signature)的生成逻辑,并演示如何通过浏览器开发者工具进行断点调试、变量追踪,最终使用Node.js与crypto-js库本地复现完整请

weixin_26642481的博客 752

如何用Python编程实现算术割圆术?

第10章 割圆术 Python编程要点 from … import …语句 math模块的sqrt()函数 round()函数 10.1 图解九章 {:–}觚( gū ):正多边形。“六觚”即正六边形,“十二觚”即正十二边形。 图10-1 六觚、十二觚、二十四觚 提示 图10-1所示由图解九章源码中的“图解割圆术.py”自动绘制而成,我们可运行脚本文件,查看动态的绘制过程。 割六觚以...

人邮异步社区 3237

【入门篇】UML-ClassDiagram类图

UML-ClassDiagram类图 基础入门篇

weixin_52894047的博客 2745

OpenMM | PDBFixer 用于蛋白质预处理

PDBFixer 用于蛋白质预处理

DrugOne 3007

【UML建模】类图(Class Diagram)

在我们的日常学习、工作、考试以及面试的过程中,都会使用到类图,它是一种表示系统中的类、接口、属性和方法等静态结构的图形语言,常用于面向对象的软件设计、分析,对技术实现起到指导作用,是架构师的常用工具之一。通过类图,可以更好地理解系统的结构和设计,提高开发效率和软件质量。对于学习过设计模式的同学来说,肯定会有更深刻的感触,正是因为有类图我们更直观的理解各种模式的实现方式,并按照类图的指导去完成我们自己的设计模式代码。类、属性、方法、访问权限的表示方式类与类之间的关系及其符号表示方式基数的使用。

积木成林,聚沙成塔 1万+

游戏大厂射击游戏无缝大世界游戏DS服务器架构设计方案详解

摘要: 本文深入解析游戏大厂无缝大世界射击游戏的分布式服务器(DS)架构设计方案。以《和平精英》《量子特攻》为例,阐述如何通过动态分区、兴趣管理、弹性扩缩等核心技术应对高并发、低延迟、无缝切换等挑战。架构分为世界协调层、分区计算层、物理判定层等模块,结合微服务化、快照同步和Kubernetes调度,实现玩家跨区无感知迁移与一致判定。重点优化动态负载均衡、状态同步算法及容灾备份,依托分布式数据库与多云部署保障高可用性,为同类游戏提供可扩展的技术范本。(149字) 关键词: 无缝大世界、分布式服务器、动态分区、

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 563

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

步步为营UML建模系列六、类图(Class diagram)

转载自:http://www.cnblogs.com/springyangwc/archive/2012/01/10/2317771.html 概述类图(Class Diagram)是描述类、接口、协作以及它们之间关系的图,用来显示系统中各个类的静态结构。类图是定义其他图的基础,在类图基础上,可以使用状态图、协作图、组件图和配置图等进一步描述系统其他方面的特性。类图包括7个元素:类(Class)、...

weixin_34272308的博客 322

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

统一建模语言UML之类图(Class Diagram)(表示|关系|举例)

UML是软件设计和面向对象编程中常用的一种标准化建模语言,对于可视化系统结构和功能非常有用,类图有多种不同类型的图:用例图,类图,时序图,活动图和状态图,每类图都有规范的表示,不局限于语言,本文介绍以下内容(1)UML的图分类(2)类图的表示(3)类图的关系(4)类图的作用。

weixin_45526117的博客 4290

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

UML类图(class diagram)

UML从考虑系统的不同角度出发,定义了用况图、类图、对象图、包图、状态图、活动图、序列图、通信图、构件图、部署图等10种图。 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency) 泛化(Generalization) 【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎.

吹灭读书灯 一身都是月的博客 5551

【UML】类图Class Diagram

面向对象分析:OOA(Object-Oriented Analysis)面向对象设计:OOD(Object-Oriented design)面向对象分析和面向对象设计的核心问题是怎么抽象对象。类图就是用来表示对象,可以表示对象的属性、行为以及对象之间的关系。fill:#333;stroke:1;fill:none;important;important;important;important;important;important;important;important;important;

郭老二 1391

C++ UML类图详解

类图(Class Diagram): 类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图的3个基本组件:类名、属性、方法。在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation,组合(Composition),依赖(Dependency)

u013921164的博客 4870

SQLite DBHelp

c#连接SQLite SQLite这个精巧的小数据库,无需安装软件,只需要一个System.Data.SQLite.DLL文件即可操作SQLite数据库。SQLite是一个开源数据库,现在已变得越来越流行,它的体积很小,被广泛应用于各种不同类型的应用中。SQLite已经是世界上布署得最广泛的SQL数据库引擎,被用在无以计数的桌面电脑应用中,还有消费电子设备中,如移动电话、掌上电脑和MP3播放器等...

weixin_30784141的博客 184

C# Sqlite数据库帮助类(DBHelperSQLite)

C# Sqlite帮助类,添加数据库文件判断以及表判断,没有则创建

LJF的博客 1842

SQLlite中常用命令

找到一些在SQLlite中常用命令:命令描述.backup ?DB? FILE备份 DB 数据库(默认是 "main")到 FILE 文件。.bail ON|OFF发生错误后停止。默认为 OFF。.databases列出数据库的名称及其所依附的文件。.dump ?TABLE?以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TA...

weixin_34163553的博客 569

【UML】类图(Class Diagram)

初识类图,对类图有了一个大概的认识,因为是第一次学习类图,理解的比较浅显,从下面几个方面介绍一下类图: 1、什么是类图 2、类图的组成 3、类图中的关系 4、类图--机房收费系统

知世俗而不世俗 2406
上一篇: 对Asp.net Mvc 和 jQuery UI使用者的一些忠告
下一篇: wp8手机不能用wifi共享精灵连无线么只看楼主 收藏
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值