zoukankan      html  css  js  c++  java
  • 支持多数据库访问组件

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

      

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

      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 }
  • 相关阅读:

    bzoj3052: [wc2013]糖果公园
    莫队算法心得
    bzoj1104: [POI2007]洪水pow
    bzoj1102: [POI2007]山峰和山谷Grz
    bzoj1121: [POI2008]激光发射器SZK
    bzoj1113: [Poi2008]海报PLA
    bzoj1103: [POI2007]大都市meg
    bzoj1396: 识别子串
    bzoj3756: Pty的字符串
  • 原文地址:https://www.cnblogs.com/glory0727/p/8976310.html
Copyright © 2011-2022 走看看