支持多数据库访问组件

  需求千变万化,我们的应用软件要满足支持多个数据库访问,应对以前的代码封闭不能改动。

  

一  定义数据库基础访问接口

  1 /// <summary>
  2 /// 数据库访问适配器
  3 /// </summary>
  4 public interface IDBAccessProvider
  5 {
  6 
  7     /// <summary>
  8     /// 获取连接状态
  9     /// </summary>
 10     ConnectionState ConnState { get; }
 11     /// <summary>
 12     /// 是否存在一个已经开始的事务
 13     /// </summary>
 14     bool IsExistTrans { get; }
 15 
 16     /// <summary>
 17     /// 打开连接
 18     /// </summary>
 19     void OpenConn();
 20     /// <summary>
 21     /// 关闭连接
 22     /// </summary>
 23     void CloseConn();
 24 
 25     /// <summary>
 26     /// 开始事务
 27     /// </summary>
 28     void BeginTrans();
 29     /// <summary>
 30     /// 提交事务
 31     /// </summary>
 32     void CommitTrans();
 33     /// <summary>
 34     /// 回滚事务
 35     /// </summary>
 36     void RollbackTrans();
 37 
 38     /// <summary>
 39     /// 创建一个命令参数
 40     /// </summary>
 41     /// <param name="name">参数名称</param>
 42     /// <param name="value">参数值</param>
 43     /// <param name="dbType">参数类型</param>
 44     /// <param name="direction">参数方向</param>
 45     /// <returns>参数对象</returns>
 46     IDbDataParameter CreateParameter(string name, object value, DbType dbType, ParameterDirection direction);
 47     /// <summary>
 48     /// 创建一个命令参数
 49     /// </summary>
 50     /// <param name="name">参数名称</param>
 51     /// <param name="value">参数值</param>
 52     /// <param name="dbType">参数类型</param>
 53     /// <returns>参数对象</returns>
 54     IDbDataParameter CreateParameter(string name, object value, DbType dbType);
 55     /// <summary>
 56     /// 创建一个命令参数
 57     /// </summary>
 58     /// <param name="name">参数名称</param>
 59     /// <param name="value">参数值</param>
 60     /// <returns>参数对象</returns>
 61     IDbDataParameter CreateParameter(string name, object value);
 62 
 63     /// <summary>
 64     /// 执行一条Sql命令
 65     /// </summary>
 66     /// <param name="sqlText">sql命令文本</param>
 67     /// <param name="parames">参数表</param>
 68     /// <param name="commandType">命令类型</param>
 69     void ExecuteNonQuery(string sqlText, List<IDbDataParameter> parames, CommandType commandType);
 70     /// <summary>
 71     /// 执行一条Sql命令
 72     /// </summary>
 73     /// <param name="sqlText">sql命令文本</param>
 74     /// <param name="parames">参数表</param>
 75     void ExecuteNonQuery(string sqlText, List<IDbDataParameter> parames);
 76     /// <summary>
 77     /// 执行一条Sql命令
 78     /// </summary>
 79     /// <param name="sqlText">sql命令文本</param>
 80     void ExecuteNonQuery(string sqlText);
 81 
 82     /// <summary>
 83     /// 执行一条查询Sql命令,返回一个DataReader
 84     /// </summary>
 85     /// <param name="sqlText">sql命令文本</param>
 86     /// <param name="parames">参数表</param>
 87     /// <param name="commandType">命令类型</param>
 88     /// <param name="behavior"></param>
 89     /// <returns></returns>
 90     IDataReader ExecuteReader(string sqlText, List<IDbDataParameter> parames, CommandType commandType, CommandBehavior behavior);
 91     /// <summary>
 92     /// 执行一条查询Sql命令,返回一个DataReader
 93     /// </summary>
 94     /// <param name="sqlText">sql命令文本</param>
 95     /// <param name="parames">参数表</param>
 96     /// <param name="commandType">命令类型</param>
 97     /// <returns></returns>
 98     IDataReader ExecuteReader(string sqlText, List<IDbDataParameter> parames, CommandType commandType);
 99     /// <summary>
100     /// 执行一条查询Sql命令,返回一个DataReader
101     /// </summary>
102     /// <param name="sqlText">sql命令文本</param>
103     /// <param name="parames">参数表</param>
104     /// <returns></returns>
105     IDataReader ExecuteReader(string sqlText, List<IDbDataParameter> parames);
106     /// <summary>
107     /// 执行一条查询Sql命令,返回一个DataReader
108     /// </summary>
109     /// <param name="sqlText">sql命令文本</param>
110     /// <returns></returns>
111     IDataReader ExecuteReader(string sqlText);
112 
113     /// <summary>
114     /// 执行一条查询Sql命令,返回一个结果集的第一行第一列的值
115     /// </summary>
116     /// <param name="sqlText">sql命令文本</param>
117     /// <param name="parames">参数表</param>
118     /// <param name="commandType">命令类型</param>
119     /// <returns></returns>
120     object ExecuteScalar(string sqlText, List<IDbDataParameter> parames, CommandType commandType);
121     /// <summary>
122     /// 执行一条查询Sql命令,返回一个结果集的第一行第一列的值
123     /// </summary>
124     /// <param name="sqlText">sql命令文本</param>
125     /// <param name="parames">参数表</param>
126     /// <returns></returns>
127     object ExecuteScalar(string sqlText, List<IDbDataParameter> parames);
128     /// <summary>
129     /// 执行一条查询Sql命令,返回一个结果集的第一行第一列的值
130     /// </summary>
131     /// <param name="sqlText">sql命令文本</param>
132     /// <returns></returns>
133     object ExecuteScalar(string sqlText);
134 }
View Code

二  数据库访问基类

  1 /// <summary>
  2 /// 数据库访问适配器基类
  3 /// </summary>
  4 internal abstract class DBAccessProviderBase : IDBAccessProvider
  5 {
  6     private IDbConnection _conn;
  7     private IDbTransaction _trans;
  8 
  9     public DBAccessProviderBase(string connString)
 10     {
 11         _conn = CreateConnection();
 12         _conn.ConnectionString = connString;
 13     }
 14 
 15     /// <summary>
 16     /// 创建一个命令对象
 17     /// </summary>
 18     /// <returns></returns>
 19     protected abstract IDbCommand CreateCommand();
 20     /// <summary>
 21     /// 创建一个连接对象
 22     /// </summary>
 23     /// <returns></returns>
 24     protected abstract IDbConnection CreateConnection();
 25 
 26 
 27     /// <summary>
 28     /// 获取连接状态
 29     /// </summary>
 30     public ConnectionState ConnState { get { return _conn.State; } }
 31     /// <summary>
 32     /// 是否存在一个已经开始的事务
 33     /// </summary>
 34     public bool IsExistTrans { get { return _trans != null; } }
 35 
 36     /// <summary>
 37     /// 打开连接
 38     /// </summary>
 39     public void OpenConn() { _conn.Open(); }
 40     /// <summary>
 41     /// 关闭连接
 42     /// </summary>
 43     public void CloseConn() { _conn.Close(); }
 44 
 45     /// <summary>
 46     /// 开始事务
 47     /// </summary>
 48     public void BeginTrans()
 49     {
 50         _trans = _conn.BeginTransaction();
 51     }
 52     /// <summary>
 53     /// 提交事务
 54     /// </summary>
 55     public void CommitTrans()
 56     {
 57         if (_trans == null)
 58             throw new PSBaseException("没有开始任何事务.");
 59         _trans.Commit();
 60         _trans = null;
 61     }
 62     /// <summary>
 63     /// 回滚事务
 64     /// </summary>
 65     public void RollbackTrans()
 66     {
 67         if (_trans == null)
 68             throw new PSBaseException("没有开始任何事务.");
 69         _trans.Rollback();
 70         _trans = null;
 71     }
 72 
 73     /// <summary>
 74     /// 创建一个命令参数
 75     /// </summary>
 76     /// <param name="name">参数名称</param>
 77     /// <param name="value">参数值</param>
 78     /// <param name="dbType">参数类型</param>
 79     /// <param name="direction">参数方向</param>
 80     /// <returns>参数对象</returns>
 81     public IDbDataParameter CreateParameter(string name, object value, DbType dbType, ParameterDirection direction)
 82     {
 83         IDbCommand cmd = CreateCommand();
 84         IDbDataParameter result = cmd.CreateParameter();
 85         result.ParameterName = name;
 86         result.Direction = direction;
 87         result.DbType = dbType;
 88         result.Value = value;
 89         return result;
 90     }
 91     /// <summary>
 92     /// 创建一个命令参数
 93     /// </summary>
 94     /// <param name="name">参数名称</param>
 95     /// <param name="value">参数值</param>
 96     /// <param name="dbType">参数类型</param>
 97     /// <returns>参数对象</returns>
 98     public IDbDataParameter CreateParameter(string name, object value, DbType dbType)
 99     {
100         IDbCommand cmd = CreateCommand();
101         IDbDataParameter result = cmd.CreateParameter();
102         result.ParameterName = name;
103         result.DbType = dbType;
104         result.Value = value;
105         return result;
106     }
107     /// <summary>
108     /// 创建一个命令参数
109     /// </summary>
110     /// <param name="name">参数名称</param>
111     /// <param name="value">参数值</param>
112     /// <returns>参数对象</returns>
113     public IDbDataParameter CreateParameter(string name, object value)
114     {
115         IDbCommand cmd = CreateCommand();
116         IDbDataParameter result = cmd.CreateParameter();
117         result.ParameterName = name;
118         result.Value = value;
119         return result;
120     }
121 
122     /// <summary>
123     /// 执行一条Sql命令
124     /// </summary>
125     /// <param name="sqlText">sql命令文本</param>
126     /// <param name="parames">参数表</param>
127     /// <param name="commandType">命令类型</param>
128     public void ExecuteNonQuery(string sqlText, List<IDbDataParameter> parames, CommandType commandType)
129     {
130         IDbCommand cmd = CreateCommand();
131         cmd.Connection = _conn;
132         cmd.CommandText = sqlText;
133         cmd.CommandType = commandType;
134         if (parames != null)
135             foreach (IDbDataParameter param in parames)
136                 cmd.Parameters.Add(param);
137         if (_trans != null)
138             cmd.Transaction = _trans;
139         cmd.ExecuteNonQuery();
140     }
141     /// <summary>
142     /// 执行一条Sql命令
143     /// </summary>
144     /// <param name="sqlText">sql命令文本</param>
145     /// <param name="parames">参数表</param>
146     public void ExecuteNonQuery(string sqlText, List<IDbDataParameter> parames)
147     {
148         ExecuteNonQuery(sqlText, parames, CommandType.Text);
149     }
150     /// <summary>
151     /// 执行一条Sql命令
152     /// </summary>
153     /// <param name="sqlText">sql命令文本</param>
154     public void ExecuteNonQuery(string sqlText)
155     {
156         ExecuteNonQuery(sqlText, null, CommandType.Text);
157     }
158 
159     /// <summary>
160     /// 执行一条查询Sql命令,返回一个DataReader
161     /// </summary>
162     /// <param name="sqlText">sql命令文本</param>
163     /// <param name="parames">参数表</param>
164     /// <param name="commandType">命令类型</param>
165     /// <param name="behavior"></param>
166     /// <returns></returns>
167     public IDataReader ExecuteReader(string sqlText, List<IDbDataParameter> parames, CommandType commandType, CommandBehavior behavior)
168     {
169         IDbCommand cmd = CreateCommand();
170         cmd.Connection = _conn;
171         cmd.CommandText = sqlText;
172         cmd.CommandType = commandType;
173         if (parames != null)
174             foreach (IDbDataParameter param in parames)
175                 cmd.Parameters.Add(param);
176         if (_trans != null)
177             cmd.Transaction = _trans;
178         return cmd.ExecuteReader(behavior);
179     }
180     /// <summary>
181     /// 执行一条查询Sql命令,返回一个DataReader
182     /// </summary>
183     /// <param name="sqlText">sql命令文本</param>
184     /// <param name="parames">参数表</param>
185     /// <param name="commandType">命令类型</param>
186     /// <returns></returns>
187     public IDataReader ExecuteReader(string sqlText, List<IDbDataParameter> parames, CommandType commandType)
188     {
189         return ExecuteReader(sqlText, parames, commandType, CommandBehavior.Default);
190     }
191     /// <summary>
192     /// 执行一条查询Sql命令,返回一个DataReader
193     /// </summary>
194     /// <param name="sqlText">sql命令文本</param>
195     /// <param name="parames">参数表</param>
196     /// <returns></returns>
197     public IDataReader ExecuteReader(string sqlText, List<IDbDataParameter> parames)
198     {
199         return ExecuteReader(sqlText, parames, CommandType.Text, CommandBehavior.Default);
200     }
201     /// <summary>
202     /// 执行一条查询Sql命令,返回一个DataReader
203     /// </summary>
204     /// <param name="sqlText">sql命令文本</param>
205     /// <returns></returns>
206     public IDataReader ExecuteReader(string sqlText)
207     {
208         return ExecuteReader(sqlText, null, CommandType.Text, CommandBehavior.Default);
209     }
210 
211     /// <summary>
212     /// 执行一条查询Sql命令,返回一个结果集的第一行第一列的值
213     /// </summary>
214     /// <param name="sqlText">sql命令文本</param>
215     /// <param name="parames">参数表</param>
216     /// <param name="commandType">命令类型</param>
217     /// <returns></returns>
218     public object ExecuteScalar(string sqlText, List<IDbDataParameter> parames, CommandType commandType)
219     {
220         IDbCommand cmd = CreateCommand();
221         cmd.Connection = _conn;
222         cmd.CommandText = sqlText;
223         cmd.CommandType = commandType;
224         if (parames != null)
225             foreach (IDbDataParameter param in parames)
226                 cmd.Parameters.Add(param);
227         if (_trans != null)
228             cmd.Transaction = _trans;
229         object result = cmd.ExecuteScalar();
230         if (result == DBNull.Value)
231             result = null;
232         return result;
233     }
234     /// <summary>
235     /// 执行一条查询Sql命令,返回一个结果集的第一行第一列的值
236     /// </summary>
237     /// <param name="sqlText">sql命令文本</param>
238     /// <param name="parames">参数表</param>
239     /// <returns></returns>
240     public object ExecuteScalar(string sqlText, List<IDbDataParameter> parames)
241     {
242         return ExecuteScalar(sqlText, parames, CommandType.Text);
243     }
244     /// <summary>
245     /// 执行一条查询Sql命令,返回一个结果集的第一行第一列的值
246     /// </summary>
247     /// <param name="sqlText">sql命令文本</param>
248     /// <returns></returns>
249     public object ExecuteScalar(string sqlText)
250     {
251         return ExecuteScalar(sqlText, null, CommandType.Text);
252     }
253 }
View Code

三  SqlServer数据库

 1 internal class MSSqlDBAccessProvider : DBAccessProviderBase
 2 {
 3     public MSSqlDBAccessProvider(string connString) : base(connString) { }
 4 
 5     protected override IDbCommand CreateCommand()
 6     {
 7         return new SqlCommand();
 8     }
 9 
10     protected override IDbConnection CreateConnection()
11     {
12         return new SqlConnection();
13     }
14 }

 Oracle数据库:

 1 internal class OracleClientDBAccessProvider : DBAccessProviderBase
 2 {
 3     public OracleClientDBAccessProvider(string connString) : base(connString) { }
 4 
 5     protected override IDbCommand CreateCommand()
 6     {
 7         return new OracleCommand();
 8     }
 9 
10     protected override IDbConnection CreateConnection()
11     {
12         return new OracleConnection();
13     }
14 }

四  数据库访问适配器工厂类

 1 /// <summary>
 2 /// 数据库访问适配器工厂类
 3 /// </summary>
 4 public sealed class DBAccessProviderFactory
 5 {
 6     /// <summary>
 7     /// 常数:Oracle.Data.OracleClient数据库驱动
 8     /// </summary>
 9     public const int PROVIDERTYPE_ORACLE_CLIENT = 1;
10     /// <summary>
11     /// 常数:Sql Server数据库驱动
12     /// </summary>
13     public const int PROVIDERTYPE_MSSQL = 2;
14 
15     /// <summary>
16     /// 实例化适配器
17     /// </summary>
18     /// <param name="providerType">数据库驱动类型</param>
19     /// <param name="connString">数据库连接字符串</param>
20     /// <returns></returns>
21     public static IDBAccessProvider GetDBAccessProvider(int providerType, string connString)
22     {
23         switch (providerType)
24         {
25             case PROVIDERTYPE_ORACLE_CLIENT:
26                 return new OracleClientDBAccessProvider(connString);
27             case PROVIDERTYPE_MSSQL:
28                 return new MSSqlDBAccessProvider(connString);
29         }
30         throw new Exception("不支持的数据库类型.");
31     }
32 }

猜你喜欢

转载自www.cnblogs.com/glory0727/p/8976310.html