再谈SQLHelper

    在机房个人重构时虽然也使用了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不仅实现代码的复用,还体现面向对象中抽象和封装的特点,上次写这个类和这次写感受是不一样的,正可谓学习是一个反复的过程,只有一次次的刺激才能理解的深刻,知识之间也都是想通的,我们要做的是领悟它的思想。

你可能感兴趣的:(再谈SQLHelper)