练手之作:易元威客任务发布系统(2)
昨天(http://www.cnblogs.com/arthur_wuancheng/archive/2008/10/20/1314946.html)把 易元威客的相关需求说了下 今天先来谈谈后端,
关于后端的需求主要达到这2条
3.需要三层架构,适应未来扩展需求
4.需要兼容不同的数据库,初步支持 mysql,oracle,mssql,access(结构上支持)
我们先看看三层架构里面主要的项目
1.数据实体类YYT.Entity
2.业务逻辑类 封装了 相关数据库操作 YYT.Data.MySql或YYT.Data.SqlServer
3.YYT.Data 数据访问层 主要是DBHelper2.0 以及利用反射 和类工厂构建的相关(mysql或sqlserver或其他数据库)访问类
以上三层 借鉴了Dnt论坛的一些源码 (后来看了一下论坛的源码也借鉴了一些网上的源码)
有关3的反射和类工厂有必要说一下首先在DatabaseProvider 提供了一个反射机制 从配置文件读取相关信息 反射并返回实例
1 /// <summary>
2 /// IDbProvider接口
3 /// </summary>
4 public static IDbProvider Provider
5 {
6 get
7 {
8 if (m_provider == null)
9 {
10 lock(lockHelper)
11 {
12 if (m_provider == null)
13 {
14 try
15 {
16 m_provider = (IDbProvider)Activator.CreateInstance(Type.GetType(string.Format("YYT.Data.{0}Provider, YYT.Data.{0}", BaseConfigs.GetDbType), false, true));
17 }
18 catch
19 {
20 throw new Exception("请检查YYT.config中Dbtype节点数据库类型是否正确,例如:SqlServer、Access、MySql");
21 }
22
23 }
24 }
25
26 //m_provider = new DbProviderFinder().GetDbProvider("accesss");
27
28
29 }
30 return m_provider;
31 }
32 }
33
34 /// <summary>
35 /// DbFactory实例
36 /// </summary>
37 public static DbProviderFactory Factory
38 {
39 get
40 {
41 if (m_factory == null)
42 {
43 m_factory = Provider.Instance();
44 }
45 return m_factory;
46 }
47 }
2 /// IDbProvider接口
3 /// </summary>
4 public static IDbProvider Provider
5 {
6 get
7 {
8 if (m_provider == null)
9 {
10 lock(lockHelper)
11 {
12 if (m_provider == null)
13 {
14 try
15 {
16 m_provider = (IDbProvider)Activator.CreateInstance(Type.GetType(string.Format("YYT.Data.{0}Provider, YYT.Data.{0}", BaseConfigs.GetDbType), false, true));
17 }
18 catch
19 {
20 throw new Exception("请检查YYT.config中Dbtype节点数据库类型是否正确,例如:SqlServer、Access、MySql");
21 }
22
23 }
24 }
25
26 //m_provider = new DbProviderFinder().GetDbProvider("accesss");
27
28
29 }
30 return m_provider;
31 }
32 }
33
34 /// <summary>
35 /// DbFactory实例
36 /// </summary>
37 public static DbProviderFactory Factory
38 {
39 get
40 {
41 if (m_factory == null)
42 {
43 m_factory = Provider.Instance();
44 }
45 return m_factory;
46 }
47 }
在ExecuteDataset调用如下
1 public static DataSet ExecuteDataset(DbConnection connection, CommandType commandType, string commandText, params DbParameter[] commandParameters)
2 {
3 if (connection == null) throw new ArgumentNullException("connection");
4
5 // 预处理
6 DbCommand cmd = Factory.CreateCommand();
7 bool mustCloseConnection = false;
8 PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
9
10 // 创建DbDataAdapter和DataSet.
11 using (DbDataAdapter da = Factory.CreateDataAdapter())
12 {
13 da.SelectCommand = cmd;
14 DataSet ds = new DataSet();
15
16
17
18 // 填充DataSet.
19 da.Fill(ds);
20
21 m_querycount++;
22
23 cmd.Parameters.Clear();
24
25
26 if (mustCloseConnection)
27 connection.Close();
28
29 return ds;
30 }
31 }
2 {
3 if (connection == null) throw new ArgumentNullException("connection");
4
5 // 预处理
6 DbCommand cmd = Factory.CreateCommand();
7 bool mustCloseConnection = false;
8 PrepareCommand(cmd, connection, (DbTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection);
9
10 // 创建DbDataAdapter和DataSet.
11 using (DbDataAdapter da = Factory.CreateDataAdapter())
12 {
13 da.SelectCommand = cmd;
14 DataSet ds = new DataSet();
15
16
17
18 // 填充DataSet.
19 da.Fill(ds);
20
21 m_querycount++;
22
23 cmd.Parameters.Clear();
24
25
26 if (mustCloseConnection)
27 connection.Close();
28
29 return ds;
30 }
31 }