再谈SQLHelper

来源:互联网 发布:生死狙击阿春解说矩阵 编辑:程序博客网 时间:2024/06/12 05:10

    在机房个人重构时虽然也使用了SQLHelper,但很多都是听他们说的要使用这个东西,自己也理解的很浅,在学习牛腩时恍然大悟,原来是这么一回事,正所谓之前是组装汽车,现在变为自己制造了,牛腩中看到了SQLHelper怎么一步步演化过来,其实它就是一个类,我们将对数据库操作共同的东西抽象出来封装在一个类里面,既然是对数据库操作,就包括查询和非查询,然后每种方法又包括带参和不带参,所以共有四种组合:不带参数和带参数的增删改、不带参数和带参数查询,然后在使用时根据需要给它传递一些参数进去。代码中是对四种方法的定义,其中这次除了使用try...catch,还用到using,用于定义一个范围,在此范围结束时释放资源。

public class SQLHelper    {        private SqlConnection conn = null;        private SqlCommand cmd = null;        private SqlDataReader sdr = null;        public SQLHelper() //把共同的部分提炼出来,比如字符串连接和打开关闭数据库操作        {            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;            conn = new SqlConnection(connStr);        }        private SqlConnection GetConn()        {            if (conn.State == ConnectionState.Closed)            {                conn.Open();            }            return conn;        }       /// <summary>        /// 执行不带参数增删改操作       /// </summary>       /// <param name="cmdText">sql语句或存储过程</param>       /// <param name="ct">命令类型</param>       /// <returns>受影响行数</returns>        public int ExecuteNonQuery(string cmdText,CommandType ct)        {            int res;            try            {                cmd = new SqlCommand(cmdText , GetConn());                cmd.CommandType = ct;                res = cmd.ExecuteNonQuery();            }            catch (Exception ex)            {                throw ex;            }            finally            {                if (conn.State == ConnectionState.Open) //'如果数据库连接状态为关闭则将其打开                {                    conn.Close();                }            }            return res;        }        /// <summary>        /// 执行带参数增删改操作        /// </summary>        /// <param name="cmdText">sql语句或存储过程</param>        /// <param name="ct">命令类型</param>        /// <returns>受影响行数</returns>        public int ExecuteNonQuery(string cmdText,SqlParameter []paras,CommandType ct)        {            int res;            using (cmd =new SqlCommand (cmdText ,GetConn ()))            {                cmd.CommandType = ct;                cmd.Parameters .AddRange (paras);                res =cmd.ExecuteNonQuery ();            }            return res ;        }        /// <summary>        /// 执行不带参数SQL语句查询或存错过程        /// </summary>        /// <param name="cmdText">sql语句或存错过程</param>        /// <param name="ct">命令类型</param>        /// <returns>受影响行数</returns>        public DataTable ExecuteQuery(string cmdText,CommandType ct)        {            DataTable dt=new DataTable ();            cmd =new SqlCommand (cmdText ,GetConn ());            cmd.CommandType = ct;                   using(sdr =cmd .ExecuteReader (CommandBehavior .CloseConnection ))         {     dt.Load (sdr );         }            return dt;          }        /// <summary>        /// 执行带参数SQL语句查询或存错过程        /// </summary>        /// <param name="cmdText">sql语句或存错过程</param>        /// <param name="paras">参数数组</param>        /// <param name="ct">命令类型</param>        /// <returns>受影响行数</returns>        public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras,CommandType ct)        {            DataTable dt = new DataTable();            cmd = new SqlCommand(cmdText, GetConn());            cmd.CommandType = ct;            cmd.Parameters.AddRange(paras);            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))            {                dt.Load(sdr);            }            return dt;        }    }


        小结:SQLHelper不仅实现代码的复用,还体现面向对象中抽象和封装的特点,上次写这个类和这次写感受是不一样的,正可谓学习是一个反复的过程,只有一次次的刺激才能理解的深刻,知识之间也都是想通的,我们要做的是领悟它的思想。

0 0
原创粉丝点击