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

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 }
二 数据库访问基类

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 }
三 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 }