【机房重构&牛腩】SQLHelper为D层提供强大的方法集合

前言

我们都知道,机房收费系统(RoomChargeSystem,以后简称RCS),是一个通过操作,把数据输入到数据库中,其中必定不能少的就是与数据库交互以及数据库的操纵语言。

一、编制知识网

在第一次做RCS的时候,我就借鉴了“学生信息管理系统”中Model里面的一个ExecuteSQL函数:只需要把参数传进去,从而可以对数据库进行“增删改查”。但是在重构的时候刚开始没有意识到要把这个给汇总一下,等做出来几条线以后才发现自己需要抽象出来这些方法,然后从网上看了看、找了找如何对数据库操作方法进行抽象,然后就了解了SQLHelper这个类,下面我通过一步步的对比,把SQLHelper类给大家展示出来。

二、对比分类

依旧用登陆这个为例,在三层学习的时候我们都做过这个例子。其中在D层的代码是这样的:
1.链接数据库
2.创建数据库链接对象cmd
3.选择命令类型,告诉执行的是一个文本(text)、存储过程(StoredProcedure)还是表名称(TableDirect)
4.执行命令

public class UserDAO
    {
        public Login.Model .UserInfo SelectUser (string userName, string passWord)
        {
            using (SqlConnection conn=new SqlConnection (DBUtil .ConnString ))   //建立数据库连接。
            {
                #region  连接数据库,创建连接对象cmdSqlCommand cmd = conn.CreateCommand();     
                cmd.CommandText = @"SELECT ID ,UserName, Password ,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter ("@UserName",userName ));
                cmd.Parameters.Add(new SqlParameter("@Password", passWord));
                #endregion
                conn.Open();  //打开连接


                //创建数据读取对象,循环读取数据
                SqlDataReader reader = cmd.ExecuteReader();
                Login.Model.UserInfo user = null;
                while (reader.Read())
                {
                    if (user == null)
                    {
                        user = new Login.Model.UserInfo();
                    }
                    user.ID = reader.GetInt32(0);     //获取指定列的 32 位有符号整数形式的值
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);

                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }
                }
                return user;   //很重要 
            }
        }
    }

但是如果我要做查询余额有需要将上面的代码都写一遍,这样代码会有很多的重复,于是就轮到我们的SQLHelper华丽登场了。

在机房收费系统中,涉及到与数据库交互的无非是“增删改查”,而这四类有可以分为四类:带参数查询、不带参数查询、带参数的<增删改>、不带参数的<增删改>:
SQLHelper

                                 图一 机房收费系统功能划分

四、SQLHelper类

我用C#语言,编写了一个SQLHelper类,到时候就可以直接实例化他其中的方法

1)不带参数的查询

  ///<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 ))  //关闭sdr的时候,也关闭连接。
            {
                dt.Load(sdr);   //加载sdr,赋值给dt
            }
            return dt;
        }

2)带参数的查询


///<summary >
        ///执行带参数的SQL查询语句或者是存储过程
        /// </summary>
        /// <param name="sql" >要执行的SQL查询语句或者是存储过程</param>
        /// <param name="paras">参数集合</param>
        /// <param name="ct">命令类型</param>
        /// <returns >返回更新的记录数  </returns>       
        public DataTable ExecuteQuery(string sql, SqlParameter[] paras, CommandType ct)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(sql, GetConn());
            cmd.CommandType = ct;
            cmd.Parameters.AddRange(paras);
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))  //关闭sdr的时候,也关闭连接。
            {
                dt.Load(sdr);   //加载sdr,赋值给dt
            }
            return dt;
        }

3)不带参数的增删改

///<summary >
        ///执行不带参数的SQL增删改语句或者存储过程
        /// </summary>
        /// <param name="cmdText">要执行的SQL增删改语句或者存储过程</param>
        /// <param name ="ct">命令类型</param>
        /// <returns >返回更新的记录数  </returns>
        public int ExecuteNonQuery(string cmdText,CommandType ct)
        {
            int res;
            try
            {
                SqlCommand 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;
        }

4)带参数的增删改

///<summary >
        ///执行带参数的SQL增删改语句或者存储过程
        /// </summary>
        /// <param name="paras" >参数集合</param>
        /// <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;
        }

五、学习心得

学到现在,发现自己以前有好多的知识都没有认真总结,现在要用到,发现自己已经记不起来了。“出来混迟早是要还的”这句话真的是有道理的。总结的时候你可能不知道是什么意思,但是经过岁月的”沉淀“和自己反复的“反刍”。最后一定会在自己的总结里面看到好处!加油!
【作者:王雷 http://blog.csdn.net/kisscatforever

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 103
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 103
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值