C# 操作数据库就的那点代码

操作数据库的那点代码,别在费劲每个数据库都写一遍SQLHelper,SQLiteHelper,OleDbHelper,了,这里都有了.

接口不发了,自己抽取定义就行了.

public abstract class DbHelperBase : IDbHelper
    {
        /// <summary>
        /// 直接获得连接字符串
        /// </summary>
        /// <param name="connStr"></param>
        public DbHelperBase(string connStr)
        {
            _ConnStr = connStr;
            _LockExecNonQuery = new object();
            _LockGetDataReader = new object();
            _LockGetScalar = new object();
            _LockGetDataSet = new object();
        }
        /// <summary>
        /// 连接字符串
        /// </summary>
        protected string _ConnStr;
        /// <summary>
        /// 是否事务
        /// </summary>
        bool _IsTrans = false;

        object _LockExecNonQuery;
        object _LockGetDataReader;
        object _LockGetScalar;
        object _LockGetDataSet;

        protected abstract DbConnection DBConnectionObj { get; }
        protected abstract DbCommand DbCommandObj { get; }
        protected abstract DbDataAdapter DbDataAdapterObj { get; }
        protected DbTransaction DbTransObj;
        /// <summary>
        /// 当前连接
        /// </summary>
        public DbConnection CurrentConnection
        {
            get
            {
                return DBConnectionObj;
            }
        }
        /// <summary>
        /// 执行sql问错误写日志方法
        /// </summary>
        protected virtual void WriteErrLog(Exception ex, string sqlText, params DbParameter[] param)
        {
            StringPlus logs = new StringPlus();
            logs.AppendLine("SQL文本:");
            logs.AppendLine(sqlText);
            logs.AppendLine("Sql文参数:");
            if (param != null)
            {
                foreach (DbParameter item in param)
                {
                    logs.AppendSpaceLine(1, "参数名:{0},参数值:{1}", item.ParameterName, item.Value);
                }
            }
            logs.AppendLine("原始错误:");
            logs.AppendLine(ex.Message);
            LogHelper.WriteLog("DbErrorLog", logs.ToString());
        }
        /// <summary>
        /// 打开连接,如果已经打开则什么都不执行了
        /// </summary>
        protected virtual void OpenConnection()
        {
            if (DBConnectionObj.State != ConnectionState.Open)
            {
                DBConnectionObj.ConnectionString = _ConnStr;
                DBConnectionObj.Open();
            }
        }
        /// <summary>
        /// 关闭连接,如果没有开始事务或连接打开时才关闭
        /// </summary>
        void CloseConnect()
        {
            if (!_IsTrans)
            {
                if (DBConnectionObj.State == ConnectionState.Open)
                {
                    DBConnectionObj.Close();
                    DBConnectionObj.Dispose();
                }
            }
        }
        /// <summary>
        /// 给当前DbCommand对象赋值,并且OpenConnection();
        /// </summary>
        void SetCommandAndOpenConnect(string sqlText, CommandType cmdType, params DbParameter[] param)
        {
            //按说赋值Connection,CommandType,是不用多次赋值的
            DbCommandObj.CommandType = cmdType;
            DbCommandObj.Connection = DBConnectionObj;
            DbCommandObj.Parameters.Clear();
            if (param != null)
            {
                DbCommandObj.Parameters.AddRange(param);
            }
            DbCommandObj.CommandText = sqlText;
            OpenConnection();
        }
        /// <summary>
        /// 开始执行事务
        /// </summary>
        public virtual void TransStart()
        {
            OpenConnection();
            DbTransObj = DBConnectionObj.BeginTransaction();
            DbCommandObj.Transaction = DbTransObj;
            _IsTrans = true;
        }
        /// <summary>
        /// 事务提交
        /// </summary>
        public virtual void TransCommit()
        {
            _IsTrans = false;
            DbTransObj.Commit();
            CloseConnect();
        }
        /// <summary>
        /// 事务回滚
        /// </summary>
        public virtual void TransRollback()
        {
            _IsTrans = false;
            DbTransObj.Rollback();
            CloseConnect();
        }
        /// <summary>
        /// 执行一条指定命令类型(SQL语句或存储过程等)的SQL语句,返回所影响行数
        /// </summary>
        public virtual int ExecNonQuery(string sqlText, CommandType cmdType, params DbParameter[] param)
        {
            lock (_LockExecNonQuery)
            {
                try
                {
                    SetCommandAndOpenConnect(sqlText, cmdType, param);
                    return DbCommandObj.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    WriteErrLog(ex, sqlText, param);
                    throw new DbDataException();
                }
                finally
                {
                    CloseConnect();
                }
            }
        }
        /// <summary>
        /// 执行一条普通SQL语句的命令,返回所影响行数
        /// </summary>
        public virtual int ExecNonQuery(string sqlText, params DbParameter[] param)
        {
            return ExecNonQuery(sqlText, CommandType.Text, param);
        }
        /// <summary>        
        /// 获得DataReader对象
        /// </summary>
        public virtual DbDataReader GetDataReader(string sqlText, CommandType cmdType, CommandBehavior cmdBehavior, params DbParameter[] param)
        {
            lock (_LockGetDataReader)
            {
                try
                {
                    SetCommandAndOpenConnect(sqlText, cmdType, param);
                    DbDataReader dbReader = DbCommandObj.ExecuteReader(cmdBehavior);
                    return dbReader;
                }
                catch (Exception ex)
                {
                    WriteErrLog(ex, sqlText, param);
                    throw new DbDataException();
                }
                finally
                {
                    //DataReader用dbReader对象来关闭,即使非事务也是,不要把注释取消
                    //CloseConnect();
                }
            }
        }
        /// <summary>
        /// 获得DataReader对象
        /// </summary>
        public virtual DbDataReader GetDataReader(string sqlText, CommandType cmdType, params DbParameter[] param)
        {
            CommandBehavior cmdBehavior;
            if (_IsTrans)
            {
                cmdBehavior = CommandBehavior.Default;
            }
            else
            {
                //非事务时,关闭DataReader则关闭当前连接
                cmdBehavior = CommandBehavior.CloseConnection;
            }
            return GetDataReader(sqlText, cmdType, cmdBehavior, param);
        }
        /// <summary>
        /// 执行sql语句返回DataReader对象
        /// </summary>
        public virtual DbDataReader GetDataReader(string sqlText, params DbParameter[] param)
        {
            return GetDataReader(sqlText, CommandType.Text, param);
        }
        /// <summary>
        /// 获得首行首列
        /// </summary>
        public virtual object GetScalar(string sqlText, CommandType cmdType, params DbParameter[] param)
        {
            lock (_LockGetScalar)
            {
                try
                {
                    SetCommandAndOpenConnect(sqlText, cmdType, param);
                    return DbCommandObj.ExecuteScalar();

                }
                catch (Exception ex)
                {
                    WriteErrLog(ex, sqlText, param);
                    throw new DbDataException();
                }
                finally
                {
                    CloseConnect();
                }
            }
        }
        /// <summary>
        /// 执行SQL语句,返回首行首列
        /// </summary>
        public virtual object GetScalar(string sqlText, params DbParameter[] param)
        {
            return GetScalar(sqlText, CommandType.Text, param);
        }
        /// <summary>
        /// 执行一条SQL语句返回DataSet对象
        /// </summary>
        public virtual DataSet GetDataSet(string sqlText, CommandType cmdType, params DbParameter[] param)
        {
            lock (_LockGetDataSet)
            {
                try
                {
                    SetCommandAndOpenConnect(sqlText, cmdType, param);
                    DbDataAdapterObj.SelectCommand = DbCommandObj;
                    DataSet ds = new DataSet();
                    DbDataAdapterObj.Fill(ds);
                    return ds;
                }
                catch (Exception ex)
                {
                    WriteErrLog(ex, sqlText, param);
                    throw new DbDataException();
                }
                finally
                {
                    CloseConnect();
                }
            }
        }
        /// <summary>
        /// 执行一条SQL语句返回DataSet对象
        /// </summary>        
        public virtual DataSet GetDataSet(string sqlText, params DbParameter[] param)
        {
            return GetDataSet(sqlText, CommandType.Text, param);
        }
        /// <summary>
        /// 执行一条SQL语句返回DataTable对象(调用GetDataSet)
        /// </summary>        
        public virtual DataTable GetDataTable(string sqlText, params DbParameter[] param)
        {
            return GetDataTable(sqlText, CommandType.Text, param);
        }
        /// <summary>
        /// 执行一条SQL语句返回DataTable对象(调用GetDataSet)
        /// </summary>
        public virtual DataTable GetDataTable(string sqlText, CommandType cmdType, params DbParameter[] param)
        {
            return (GetDataSet(sqlText, cmdType, param)).Tables[0];
        }
    }

  

下面是一个sqlserver的实现

 public class SQLHelper : DbHelperBase
    {
        public SQLHelper(string connStr)
            : base(connStr)
        { }

        SqlConnection _DBConnectionObj;
        SqlCommand _DbCommandObj;
        SqlDataAdapter _DbDataAdapterObj;

        protected override DbConnection DBConnectionObj
        {
            get
            {
                //SqlBulkCopy aa = new SqlBulkCopy(new SqlConnection());
                if (_DBConnectionObj == null)
                {
                    _DBConnectionObj = new SqlConnection(_ConnStr);
                }
                return _DBConnectionObj;
            }
        }

        protected override DbCommand DbCommandObj
        {
            get
            {
                if (_DbCommandObj == null)
                {
                    _DbCommandObj = new SqlCommand();
                }
                return _DbCommandObj;
            }
        }

        protected override DbDataAdapter DbDataAdapterObj
        {
            get
            {
                if (_DbDataAdapterObj == null)
                {
                    _DbDataAdapterObj = new SqlDataAdapter();
                }
                return _DbDataAdapterObj;
            }
        }

    }

  

使用示例:

            IDbHelper sql = new SQLHelper("连接字符串");
            try
            {
                sql.TransStart(); //事务开始
                sql.ExecNonQuery("执行sql语句1"); //执行(增删改查)一条sql语句
                sql.ExecNonQuery("执行sql语句2"); //执行(增删改查)一条sql语句
                DataTable dt = sql.GetDataTable("查询sql语句1"); //获取一些数据
                sql.TransCommit(); //提交事务
            }
            catch (Exception ex)
            {
                sql.TransRollback(); //事务回滚
                throw;
            }

  

 

posted @ 2015-02-02 14:46  老张一笑  阅读(1856)  评论(2编辑  收藏  举报