自己琢磨出来的数据库访问底层类

为了让数据访问更加简单,我给数据库访问抽象了一下,

下面是我的数据访问底层的架构图:

 

代码
    /// <summary>
    
/// 数据库操作基类
    
/// </summary>
    public class BaseHelper<T> : IDisposable
        
where T : AbsConnString, new()
    {
        
//Database connection strings
        private static T _connString = new T();

        
private IDbConnection _dbconnection;
        
private IDbCommand _dbcommand;
        
/// <summary>
        
/// 实现构造函数
        
/// </summary>
        
/// <param name="conn">必须是集成自AbsConnString的类</param>
        public BaseHelper()
        {
            _dbconnection 
= CreateConnection();
            _dbcommand 
= CreateCommand(_dbconnection);
        }
        
private static IDbCommand CreateCommand(IDbConnection conn)
        {
            IDbCommand cmd 
= conn.CreateCommand();
            cmd.CommandTimeout 
= _connString.TimeOut;
            
return cmd;
        }
        
private static IDbConnection CreateConnection()
        {
            IDbConnection conn 
= new SqlConnection();
            conn.ConnectionString 
= _connString.ConnectionString;
            
return conn;
        }

        
public int ExecuteNonQuery(string cmdText, params IDbDataParameter[] commandParameters)
        {
            
return ExecuteNonQuery(CommandType.Text, cmdText, commandParameters);
        }
        
public int ExecuteNonQuery(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            PrepareCommand(_dbcommand, 
null, cmdType, cmdText, commandParameters);
            
int val = _dbcommand.ExecuteNonQuery();
            _dbcommand.Parameters.Clear();
            
return val;
        }

        
public IDataReader ExecuteReader(string cmdText, params IDbDataParameter[] commandParameters)
        {
            
return ExecuteReader(CommandType.Text, cmdText, commandParameters);
        }
        
public IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            PrepareCommand(_dbcommand, 
null, cmdType, cmdText, commandParameters);
            IDataReader rdr 
= _dbcommand.ExecuteReader(CommandBehavior.CloseConnection);
            _dbcommand.Parameters.Clear();
            
return rdr;
        }
        
public object ExecuteScalar(string cmdText, params IDbDataParameter[] commandParameters)
        {
            
return ExecuteScalar(CommandType.Text, cmdText, commandParameters);
        }

        
public object ExecuteScalar(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            PrepareCommand(_dbcommand, 
null, cmdType, cmdText, commandParameters);
            
object obj = _dbcommand.ExecuteScalar();
            _dbcommand.Parameters.Clear();
            
return obj;
        }
        
public DataTable ExecuteTable(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            PrepareCommand(_dbcommand, 
null, cmdType, cmdText, commandParameters);
            
using (DataSet st = new DataSet())
            {
                IDbDataAdapter ap 
= new SqlDataAdapter();
                ap.SelectCommand 
= _dbcommand;
                ap.Fill(st);
                _dbcommand.Parameters.Clear();
                
return st.Tables[0];
            }
        }
        
public DataTable ExecuteTable(string cmdText, params IDbDataParameter[] commandParameters)
        {
            
return ExecuteTable(CommandType.Text, cmdText, commandParameters);
        }
        
public object ExecuteScalarByTrans(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            
using (IDbTransaction trans = _dbconnection.BeginTransaction())
            {
                PrepareCommand(_dbcommand, trans, cmdType, cmdText, commandParameters);
                
try
                {
                    
object val = _dbcommand.ExecuteScalar();

                    
if (val != null)
                    {
                        trans.Commit();
                        _dbcommand.Parameters.Clear();
                        
return val;
                    }
                    
else
                    {
                        trans.Rollback();
                    }
                }
                
catch
                {
                    trans.Rollback();
                }
                
return null;
            }
        }

        
public int ExecuteNonQueryByTrans(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            PrepareCommand(_dbcommand, 
null, cmdType, cmdText, commandParameters);
            
using (IDbTransaction trans = _dbconnection.BeginTransaction())
            {
                
try
                {
                    
int val = _dbcommand.ExecuteNonQuery();
                    
if (val > 0)
                    {
                        trans.Commit();
                        _dbcommand.Parameters.Clear();
                        
return val;
                    }
                    
else
                    {
                        trans.Rollback();
                    }
                }
                
catch
                {
                    trans.Rollback();
                }
                
return -1;
            }
        }

        
public IDbDataParameter CreateParameter(string parameterName)
        {
            
return StaticCreateParameter(parameterName);
        }
        
public IDbDataParameter CreateParameter(string parameterName, object value)
        {
            
return StaticCreateParameter(parameterName, value);
        }
        
public IDbDataParameter CreateParameter(string parameterName, SqlDbType dbType, int size, object value)
        {
            
return StaticCreateParameter(parameterName, dbType, size, value);
        }
        
public IDbDataParameter CreateParameter(string parameterName, SqlDbType dbType, object value)
        {
            
return StaticCreateParameter(parameterName, dbType, value);
        }
        
public void SetParameter(IDataParameter parameter, object value)
        {
            StaticSetParameter(parameter, value);
        }
        
#region Static Method

        
/// <summary>
        
/// Execute a SqlCommand (that returns no resultset) against the database specified in the connection string 
        
/// using the provided parameters.
        
/// </summary>
        
/// <remarks>
        
/// e.g.:  
        
///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        
/// </remarks>
        
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
        
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        
/// <param name="commandText">the stored procedure name or T-SQL command</param>
        
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
        
/// <returns>an int representing the number of rows affected by the command</returns>
        public static int StaticExecuteNonQuery(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            
using (IDbConnection conn = CreateConnection())
            {
                
using (IDbCommand cmd = CreateCommand(conn))
                {
                    PrepareCommand(cmd, 
null, cmdType, cmdText, commandParameters);
                    
int val = cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                    
return val;
                }
            }
        }
        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="cmdType"></param>
        
/// <param name="cmdText"></param>
        
/// <param name="commandParameters"></param>
        
/// <returns></returns>
        public static DataTable StaticExecuteTable(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            
using (IDbConnection connection = CreateConnection())
            {
                
using (IDbCommand cmd = CreateCommand(connection))
                {
                    PrepareCommand(cmd, 
null, cmdType, cmdText, commandParameters);
                    
using (DataSet st = new DataSet())
                    {
                        IDbDataAdapter ap 
= new SqlDataAdapter();
                        ap.SelectCommand 
= cmd;
                        ap.Fill(st);
                        cmd.Parameters.Clear();
                        
return st.Tables[0];
                    }
                }
            }
        }
        
/// <summary>
        
/// Execute a SqlCommand that returns the first column of the first record against the database specified in the connection string 
        
/// using the provided parameters.
        
/// </summary>
        
/// <remarks>
        
/// e.g.:  
        
///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        
/// </remarks>
        
/// <param name="connectionString">a valid connection string for a SqlConnection</param>
        
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        
/// <param name="commandText">the stored procedure name or T-SQL command</param>
        
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
        
/// <returns>An object that should be converted to the expected type using Convert.To{Type}</returns>
        public static object StaticExecuteScalar(CommandType cmdType, string cmdText, params IDbDataParameter[] commandParameters)
        {
            
using (IDbConnection connection = CreateConnection())
            {
                
using (IDbCommand cmd = CreateCommand(connection))
                {
                    PrepareCommand(cmd, 
null, cmdType, cmdText, commandParameters);
                    
object val = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();
                    
return val;
                }
            }
        }
        
public static IDbDataParameter StaticCreateParameter(string parameterName)
        {
            SqlParameter p 
= new SqlParameter();
            p.ParameterName 
= parameterName;
            
return p;
        }

        
public static IDbDataParameter StaticCreateParameter(string parameterName, object value)
        {
            
if (value == null)
            {
                value 
= (object)DBNull.Value;
            }
            SqlParameter p 
= new SqlParameter(parameterName, value);
            
return p;
        }

        
public static IDbDataParameter StaticCreateParameter(string parameterName, SqlDbType dbType, int size, object value)
        {
            
if (value == null)
            {
                value 
= (object)DBNull.Value;
            }
            SqlParameter p 
= new SqlParameter(parameterName, dbType, size);
            p.Value 
= value;
            
return p;
        }

        
public static IDbDataParameter StaticCreateParameter(string parameterName, SqlDbType dbType, object value)
        {
            
if (value == null)
            {
                value 
= (object)DBNull.Value;
            }

            SqlParameter p 
= new SqlParameter(parameterName, dbType);
            p.Value 
= value;
            
return p;
        }

        
public static void StaticSetParameter(IDataParameter parameter, object value)
        {
            
if (value == null)
            {
                value 
= (object)DBNull.Value;
            }
            parameter.Value 
= value;
        }

        
/// <summary>
        
///  Prepare a command for execution
        
/// </summary>
        
/// <param name="cmd">IDbCommand Object</param>
        
/// <param name="trans">IDbTransaction Object</param>
        
/// <param name="cmdType">Cmd type e.g. stored procedure or text</param>
        
/// <param name="cmdText">Command text, e.g. Select * from Products</param>
        
/// <param name="cmdParms">IDbDataParameters to use in the command</param>
        private static void PrepareCommand(IDbCommand cmd, IDbTransaction trans, CommandType cmdType, string cmdText, IDbDataParameter[] cmdParms)
        {
            
if (cmd.Connection.State != ConnectionState.Open)
            {
                cmd.Connection.Open();
            }
            cmd.CommandText 
= cmdText;
            
if (trans != null)
            {
                cmd.Transaction 
= trans;
            }
            cmd.CommandType 
= cmdType;

            
if (cmdParms != null && cmdParms.Length > 0)
            {
                
foreach (IDbDataParameter parm in cmdParms)
                {
                    cmd.Parameters.Add(parm);
                }
            }
        }
        
#endregion

        
#region IDisposable Members
        
protected void Dispose()
        {
            
//托管代码
            if (_dbcommand != null)
            {
                _dbcommand.Dispose();
                _dbcommand 
= null;
            }
            
//非托管代码
            if (_dbconnection != null)
            {
                _dbconnection.Dispose();
                _dbconnection 
= null;
            }
        }
        
#endregion
    }

 

 

代码
    /// <summary>
    
/// 数据库连接抽象类类
    
/// </summary>
    public abstract class AbsConnString
    {
        
/// <summary>
        
/// 超时默认时间为30
        
/// </summary>
        private int _timeOut = 30;
        
/// <summary>
        
/// 超时时间
        
/// </summary>
        public virtual int TimeOut
        {
            
get
            {
                
return _timeOut;
            }
        }
        
/// <summary>
        
/// 数据库的连接字符串
        
/// </summary>
        public abstract string ConnectionString { get; }
    }

 

 

代码
    public class OOSConnString : Base.AbsConnString
    {
        
public OOSConnString()
        {

        }
        
private string _connectionstring;
        
public override string ConnectionString
        {
            
get
            {
                
if (string.IsNullOrEmpty(_connectionstring))
                {
                    _connectionstring 
= System.Configuration.ConfigurationManager.ConnectionStrings["NewMaximOOSConnString"].ConnectionString;
                }
                
return _connectionstring;
            }
        }
    }

 

    /// <summary>
    
/// 对象型数据库操作类
    
/// </summary>
    public class OOSHelper : Base.BaseHelper<OOSConnString>
    {
    }

有了以上这个架构,我们数据库访问将更加方便,它支持静态调用和类的调用。

下面是采用类的调用方式(主要是应用于负责的访问方式,new时必须要用using 这样可以避免连接不能及时关闭的问题)

代码

using System;
using System.Data;
using System.Text;
using System.Collections.Generic;

using Maxim.Entity;
using Maxim.DataAccess.Access;


namespace Maxim.DataAccess.Generated._Base
{
    
/// <summary>
    
/// Class:A_CustomerBase
    
/// Author:Steven
    
/// Create:2010-4-12 14:52:13
    
/// </summary>
    public abstract class A_CustomerBase
    {        
        
/// <summary>
        
/// 
        
/// </summary>
        public A_CustomerBase()
        {
        }
        
public List<A_CustomerInfo> GetA_CustomerInfoALL()
        {
            List
<A_CustomerInfo> list = new List<A_CustomerInfo>();
            
string sql="SELECT * FROM [A_Customer]";
            
using(OOSHelper dbhelper=new OOSHelper())
            {
              
using(IDataReader reader=dbhelper.ExecuteReader(sql))
              {
                
while(reader.Read())
                {
                   list.Add(A_CustomerInfo.SetValue(reader));
                }
              }
            }
            
return list;
        }
        
        
public A_CustomerInfo GetA_CustomerInfo(string _eRPNO)
        {
            A_CustomerInfo aCustomerinfo 
= null;
            StringBuilder sql
= new StringBuilder();
            sql.Append(
"SELECT * FROM");
            sql.Append(
" [A_Customer]");
            sql.Append(
" WHERE");
            sql.Append(
" [ERPNO]=@ERPNO");
            
using(OOSHelper dbhelper=new OOSHelper())
            {
              IDbDataParameter[] p_Parms 
= new IDbDataParameter[]{
                dbhelper.CreateParameter(
"@ERPNO",_eRPNO)
              };
              
using(IDataReader reader=dbhelper.ExecuteReader(sql.ToString(),p_Parms))
              {
                
if(reader.Read())
                {
                    aCustomerinfo 
= A_CustomerInfo.SetValue(reader);
                }
              }
            }
            
return aCustomerinfo;
        }
        
public bool Insert(A_CustomerInfo aCustomerinfo)
        {
            
            StringBuilder sql
=new StringBuilder();
            sql.Append(
"INSERT INTO");
            sql.Append(
" [A_Customer](");            
            sql.Append(
"[ERPNO],");
            sql.Append(
"[CorpName],");
            sql.Append(
"[CorpAddress],");
            sql.Append(
"[CorpPhone],");
            sql.Append(
"[CorpContract],");
            sql.Append(
"[CorpTax],");
            sql.Append(
"[CorpBank],");
            sql.Append(
"[CorpBankNO],");
            sql.Append(
"[PayType],");
            sql.Append(
"[CustomerType],");
            sql.Append(
"[ERPContractType],");
            sql.Append(
"[IsDirectShip],");
            sql.Append(
"[IsEnabled],");
            sql.Append(
"[UpdateTime],");
            sql.Append(
"[CurrencyID],");
            sql.Append(
"[NeedProformaInvoice]");
            sql.Append(
") VALUES(");
            sql.Append(
"@ERPNO,");
            sql.Append(
"@CorpName,");
            sql.Append(
"@CorpAddress,");
            sql.Append(
"@CorpPhone,");
            sql.Append(
"@CorpContract,");
            sql.Append(
"@CorpTax,");
            sql.Append(
"@CorpBank,");
            sql.Append(
"@CorpBankNO,");
            sql.Append(
"@PayType,");
            sql.Append(
"@CustomerType,");
            sql.Append(
"@ERPContractType,");
            sql.Append(
"@IsDirectShip,");
            sql.Append(
"@IsEnabled,");
            sql.Append(
"@UpdateTime,");
            sql.Append(
"@CurrencyID,");
            sql.Append(
"@NeedProformaInvoice");
            sql.Append(
")");
            
            
using(OOSHelper dbhelper=new OOSHelper())
            {
                IDbDataParameter[] p_Parms
=new IDbDataParameter[]{
                    dbhelper.CreateParameter(
"@ERPNO",aCustomerinfo.ERPNO),
                    dbhelper.CreateParameter(
"@CorpName",aCustomerinfo.CorpName),
                    dbhelper.CreateParameter(
"@CorpAddress",aCustomerinfo.CorpAddress),
                    dbhelper.CreateParameter(
"@CorpPhone",aCustomerinfo.CorpPhone),
                    dbhelper.CreateParameter(
"@CorpContract",aCustomerinfo.CorpContract),
                    dbhelper.CreateParameter(
"@CorpTax",aCustomerinfo.CorpTax),
                    dbhelper.CreateParameter(
"@CorpBank",aCustomerinfo.CorpBank),
                    dbhelper.CreateParameter(
"@CorpBankNO",aCustomerinfo.CorpBankNO),
                    dbhelper.CreateParameter(
"@PayType",aCustomerinfo.PayType),
                    dbhelper.CreateParameter(
"@CustomerType",aCustomerinfo.CustomerType),
                    dbhelper.CreateParameter(
"@ERPContractType",aCustomerinfo.ERPContractType),
                    dbhelper.CreateParameter(
"@IsDirectShip",aCustomerinfo.IsDirectShip),
                    dbhelper.CreateParameter(
"@IsEnabled",aCustomerinfo.IsEnabled),
                    dbhelper.CreateParameter(
"@UpdateTime",aCustomerinfo.UpdateTime),
                    dbhelper.CreateParameter(
"@CurrencyID",aCustomerinfo.CurrencyID),
                    dbhelper.CreateParameter(
"@NeedProformaInvoice",aCustomerinfo.NeedProformaInvoice)
                };
            
return 0 < dbhelper.ExecuteNonQuery(sql.ToString(),p_Parms);
            }
        }
        
public bool Update(A_CustomerInfo aCustomerinfo)
        {
            StringBuilder sql 
= new StringBuilder();
            sql.Append(
"UPDATE");
            sql.Append(
" [A_Customer]");
            sql.Append(
" SET");
            sql.Append(
" [CorpName]=@CorpName,");
            sql.Append(
" [CorpAddress]=@CorpAddress,");
            sql.Append(
" [CorpPhone]=@CorpPhone,");
            sql.Append(
" [CorpContract]=@CorpContract,");
            sql.Append(
" [CorpTax]=@CorpTax,");
            sql.Append(
" [CorpBank]=@CorpBank,");
            sql.Append(
" [CorpBankNO]=@CorpBankNO,");
            sql.Append(
" [PayType]=@PayType,");
            sql.Append(
" [CustomerType]=@CustomerType,");
            sql.Append(
" [ERPContractType]=@ERPContractType,");
            sql.Append(
" [IsDirectShip]=@IsDirectShip,");
            sql.Append(
" [IsEnabled]=@IsEnabled,");
            sql.Append(
" [UpdateTime]=@UpdateTime,");
            sql.Append(
" [CurrencyID]=@CurrencyID,");
            sql.Append(
" [NeedProformaInvoice]=@NeedProformaInvoice");
            sql.Append(
" WHERE");
            sql.Append(
" [ERPNO]=@ERPNO");
            
using(OOSHelper dbhelper=new OOSHelper())
            {
              IDbDataParameter[] p_Parms 
= new IDbDataParameter[]{
                dbhelper.CreateParameter(
"@CorpName",aCustomerinfo.CorpName),
                dbhelper.CreateParameter(
"@CorpAddress",aCustomerinfo.CorpAddress),
                dbhelper.CreateParameter(
"@CorpPhone",aCustomerinfo.CorpPhone),
                dbhelper.CreateParameter(
"@CorpContract",aCustomerinfo.CorpContract),
                dbhelper.CreateParameter(
"@CorpTax",aCustomerinfo.CorpTax),
                dbhelper.CreateParameter(
"@CorpBank",aCustomerinfo.CorpBank),
                dbhelper.CreateParameter(
"@CorpBankNO",aCustomerinfo.CorpBankNO),
                dbhelper.CreateParameter(
"@PayType",aCustomerinfo.PayType),
                dbhelper.CreateParameter(
"@CustomerType",aCustomerinfo.CustomerType),
                dbhelper.CreateParameter(
"@ERPContractType",aCustomerinfo.ERPContractType),
                dbhelper.CreateParameter(
"@IsDirectShip",aCustomerinfo.IsDirectShip),
                dbhelper.CreateParameter(
"@IsEnabled",aCustomerinfo.IsEnabled),
                dbhelper.CreateParameter(
"@UpdateTime",aCustomerinfo.UpdateTime),
                dbhelper.CreateParameter(
"@CurrencyID",aCustomerinfo.CurrencyID),
                dbhelper.CreateParameter(
"@NeedProformaInvoice",aCustomerinfo.NeedProformaInvoice),
                dbhelper.CreateParameter(
"@ERPNO",aCustomerinfo.ERPNO)
              };
             
return 0 < dbhelper.ExecuteNonQuery(sql.ToString(),p_Parms);             
            }
        }
        
public bool Delete(string _eRPNO)
        {
            StringBuilder sql 
= new StringBuilder();
            sql.Append(
"DELETE FROM");
            sql.Append(
" [A_Customer]");
            sql.Append(
" WHERE");
            sql.Append(
" [ERPNO]=@ERPNO");
            
using(OOSHelper dbhelper=new OOSHelper())
            {
              IDbDataParameter[] p_Parms 
= new IDbDataParameter[]{
                dbhelper.CreateParameter(
"@ERPNO",_eRPNO)
              };
             
return 0 < dbhelper.ExecuteNonQuery(sql.ToString(),p_Parms);             
            }
        }
        
    }
}

 

还有一种是采用静态调用的方式(尤其在对一些简单数据访问时为了方便就用静态调用方式):

    public class WebServiceDAL
    {
        public DataTable Test()
        {
            string sql = "select * from test";
            return OOSHelper.StaticExecuteTable(System.Data.CommandType.Text, sql);
        }
    }

 

以上文章是小弟经过多年的经验无聊的时候想到的,该代码已经经过我的压力测试。

不好意思,小弟语文从高中以后从没有及格过,文章没有几个字,但是想分享给大家看看,提提意见,不懂可直接mail给我,

posted @ 2010-04-19 11:45  steven_jiangxf  阅读(2449)  评论(13编辑  收藏  举报