【牛腩新闻发布系统】一步步演化的SQLHelper

个人重构的时候,虽说都用上了sqlHelper,但是不认识它的前世今生,所有总感觉很突兀。看牛腩的时候,才恍然大悟。SQLHelper 从名字就能知道,它是和数据库有关系的,并且能帮助到数据库。这样一想,当再理解到“SQLHelper 用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库。”我们就很清楚的懂得他的作用。

今天我们仅仅以一个类来大致看一看SQLHelper 到底是怎么有不同的数据库操作变化来的。

先看一下最原始的一个查询是这样的。

using System.Data;//添加引用
using System.data.SqlClient;//添加引用
namespace  DAL
{
    public class SQLHelper
    {
        public  int Query()
        {
            //①定义数据库连接字符串
            string [email protected]"server=Madan\SQL;database=mewssystem;uid=sa;pwd=123456";
           //②传入数据库的连接字符串   固定语句
            SqlConnection conn=new SqlConnection(connStr);
			//③ 打开
			  conn.open
            //④数据库语句 变化语句
            string sql="insert into category(name) value('提高班')";
            //⑤命令执行对象 需要sql语句和conn命令 固定语句
            SqlCommand cmd=new SqlCommand(sql,conn);
            //⑥执行 返回int  固定语句
            int res=cmd.ExecuteNonQuery();
            //⑦关闭连接 固定语句
            conn.Close();
            return res;
        }
    }
}

不管我们写多少个查询类,都会发现,上面的步骤都是固定的。而会出现变化的只有两个地方,一是连接数据库的登陆用户和密码是会变化的。二是,不同的查询内容导致具体的查询语句不同。所以为了封装变化,我们将变化的部分拿了出来。也将公共的部分进行了提炼。

看了下面的代码我们就知道了不变的部分是怎么提炼的,变化的部分是怎么封装的。直接看代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">using System.Data.SqlClient;//添加引用
using System.Configuration;//添加引用
namespace DAL
{
    public class SQLHelper
    { //提出常用
        private SqlConnection conn = null;
        private SqlCommand cmd = null;
        private SqlDataReader sdr = null;

        public SQLHelper()//初始化构造函数
        {
            string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;//②web.config中已经设置好的 connStr 为连接语句 此句为传出连接语句
            conn = new SqlConnection(connStr);
        }
        // 打开连接的方法
        private SqlConnection GetConn()
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            return conn;
        }
          public int ExecuteNonQuery(string sql)
        {
            int res;
            try
            {
                cmd = new SqlCommand(sql, GetConn());//③⑤调用上面的方法 打开连接   并传入SQL语句
                res = cmd.ExecuteNonQuery();//⑥ 执行
            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();//⑦ 关闭连接
                }
            }
            return res;
        }</span>

上文中,除了可以使用try catch 保证最后关闭连接。还有一种更简单的方法使用using 用于定义一个范围,在此范围的末尾将释放对象。

下面看变化的部分是写到哪里了呢?

首先定义数据库的连接字符串,这一点我们在运用学抽象工厂+反射的时候,已经应用到了。B/S 中也是一样的。真正的做法是在Web.config中添加配置语句,以后如果有更改直接更改这一个文本即可。

其次,具体的每个查询语句就直接写在了调用类里。

<span style="font-family:KaiTi_GB2312;font-size:18px;"> string sql = "insert into category(name) values(@caName)";
            SqlParameter[] paras = new SqlParameter[]{

            new  SqlParameter("@caName",caName)};</span>

我们看大话设计模式的时候,也总是哪里代码复用多了,哪里就有了坏的味道。

放之四海而皆准,通过本文演示的sqlHelper的变化,我想总结这样一个思路,即常用的提炼出公共方法,并且里面涉及到的变化的东西只写类名,不具体。

所以只考虑三个问题:

一 :哪里重复

二:怎么抽象公共部分(全局变量?公共方法?还是其他)

三:变化的部分写在哪里

总结

前一阵写了自己的个人重构总结,今天 又看了看别人写的。感觉他们提到的收获,我也有。可是我应该总结的不到位,也总是把问题扩大化,才在机房结束之初,很挫败的感觉。吸取上次的教训,从今以后的东西不要怕难,多总结。联系旧知识。另外,之前实在不懂的要挂起来,就像SQLHelper。今后很多都会有恍然大悟的感觉,每一个阶段的学习,可以注意囫囵吞枣和盲人摸象,等待无结果所以不要纠结。大踏步,前方一定柳暗花明。

时间: 2024-10-18 05:56:06

【牛腩新闻发布系统】一步步演化的SQLHelper的相关文章

牛腩新闻发布系统(一)

结束了软件工程的学习,开始学习牛腩的时候也就意味着我们的知识体系从C/S向B/S开始转化了.这里已没有具体的窗体,开始面向web开发. 一.软件工程过渡到牛腩新闻发布系统 在听牛腩讲解新闻发布从无到有,从最初只是一个需求,到系统初步成型,给我的感觉就是,软件不管是C/S还是B/S软件开发都还是一样的. 根据之前的机房收费系统的经验和牛腩详细讲解,我看到了更多地相似和曾经.后面一点点才是新的知识. 牛腩开始新闻发布系统的时候顺序也是根据需求写一个需求文档,然后画类图,设计数据库,画系统原型,回顾一

牛腩新闻发布系统之总结篇

经过20多天的艰苦奋斗,这篇牛腩新闻发布系统的总结终于来到了.20天来,几乎都是在和"牛"老师度过的,当牛老师讲到最后还真是有点舍不得.牛老师的幽默和细心也算是深深感染了我.虽然漫长的63集教程,但是我发现没有了预先的那些抵触.也不知道是自己的成长还是牛老师的高明.63集视频没有一丝快进和不耐烦,一鼓作气将新闻发布系统呈现在自己的眼前.略微有那么一点成就感.好了,下面我就来总结一下自己的成长之路吧! 知识篇: 牛腩发布系统是我开始的第一个B/S项目,算是一个非常棒的入门经典教学.跟着牛

牛腩新闻发布系统---外键约束下如何删除记录

一.为什么使用外键? 查了些资料,八个字"保持完整性.一致性",结合我之前做的重构机房收费系统,我的理解是"防止相关表中数据没有关联而变得孤立,最终导致数据冗余",得出这个结论是上次让贾丽敏帮忙点系统时候我最深刻的感受,因为我的数据库关系图中辣么多张表却没有丝毫关系-- 既然官方解释是"完整性和一致性",就先来说明一下: 对于完整性和一致性,不少人都混为一谈了. 完整性(integrity)更多是针对实际业务来说的,比如说一个职员ID,不能在一个

牛腩新闻发布系统笔记——怎么写CSS

根据这牛腩学习敲新闻发布系统已经有一段时间了,挺佩服牛腩的,讲那么多东西,我听着也不觉得枯燥,反而有种,一不留神就会错过很多东西的感觉,所以有些地方也是重复又重复的在看. 这篇博客就总结总结小编在学习牛腩新闻发布系统的时候一些笔记.可能知识还比较原生态,but who cares.现在先提炼出来,以后慢慢的体会和升华吧. 牛腩一部分可以说是和机房相似,也是让我从.net到c#的一个过渡.中间一部分就是讲div +css了.里面的知识说多也不多的,根据不同的需求,它又有各种变形和组合,这加起来就有

牛腩新闻发布系统——真假分页

牛腩新闻发布系统已近尾声,牛老师重磅推出真假分页作为压轴,足以见得分页的重要性.我们就一起看一下真假分页的实现以及各自的特点. 一.分页简介 当我们显示足够大的数据量时,所有数据显示在一页上,会造成不必要的麻烦,本着为用户服务的态度,我们往往采用分页显示的处理办法.分页主要分为真分页与假分页. 假分页: 从数据库一次性取出所有数据绑定到控件上,再将所有数据根据每页显示记录条数进行分页.当数据量 比较大时,这种分页方法会造成查询速度, 使用户体验度降低,但是跳页速度较快. 真分页:在执行查询操作的

浅谈牛腩新闻发布系统

结束了漫长的C/S之旅,跨入B/S的学习,一切又是崭新的,充满希望. B/S的学习首先接触的便是牛腩老师的新闻发布系统,看了这么多年的网页终于要自己来编写一个网页了着实还是让我小小激动了一把.但是敲这个系统的时候总是有一种走迷宫,迷迷茫茫的感觉,什么跟什么啊... 于是,我机智的决定我要先把视频看一遍,至少要看一多半,至少得让我直到这个系统大概的框架吧.看了一半多终于形成了一个模糊的框架: 牛腩新闻发布系统分为前台和后台两部分,个人理解其实就像我们机房收费的UI层和B,D层的关系,前台负责显示给

牛腩新闻发布系统总结——网站发布和分页制作

牛腩新闻发布系统的视频看了将近半个月的时间,今天成功地把它发布了,哈哈.第一次看教学视频看得这么专注,都不带走思的,很不错.给小牛老师赞一个,嘿嘿! 言归正传,每学完一个阶段,最重要的就是总结,所以就允许我以倒序的形式,颗粒归仓吧! 牛腩新闻发布系统的发布 参考博文: win7下IIS的安装和配置 http://www.jb51.net/article/29787.htm VS2010网站发布详解 http://wanghaitaoboke.blog.163.com/blog/static/17

牛腩新闻发布系统总结(四)--知识点滴

紧接上篇博客:牛腩新闻发布系统总结(三)----知识点滴,继续我们的总结: 第五,在回复评论后如何保持滚动条的位置不变: <%@ Page Title="新闻内容-牛腩新闻发布系统" Language="C#" MasterPageFile="~/common.Master" AutoEventWireup="true" CodeBehind="newsContent.aspx.cs" Inherit

牛腩新闻发布系统--重构SQL Helper

天外有天,人外有人.自我进提高班以来,一直都在考虑,先前重构机房的时候,看到别人在D层加了SQL Helper,就一定要学者加上玩玩,等做完了以后,进行下一个阶段牛腩的时候,又看到了人家建的SQL Helper,不觉感慨,跟人家比,人家就是我的老师! 闲话就不多说了,进行正式的话题:如何写好SQL Helper?从宏观上讲,SQL Helper是完全体现了面向对象的抽象和封装的思想的.它对重复代码抽取出来,进行抽象,抽象就是为了封装,提高了代码的复用. 那么就该讨论怎么写的问题.如果我先上来给大

【牛腩新闻发布系统】----你的验证码正确么

前言 这是一个神奇的网站--牛腩新闻发布系统,虽然做的不咋地,但毕竟是自己动手敲出来,还是有一点点的满足感.同时这也是小编的第一个雠小鸭,长相不算漂亮,发育还是挺健全的. 终有一天我的丑小鸭会变成白天鹅. 一步一步的进化,一步一步的蜕变-- 你的验证码正确么 哎呀--为什么我的牛腩新闻发布系统   请输入验证码的图片一直为这个样子呀--不显示,就是不显示图片,图片加载出错呀.想想估计是图片路径不正确. 尝试一:牛老师说的图片加载路径 <img src="handler/WaterMark.