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

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

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

<pre class="plain" name="code">using System.Data;//添加引用
using System.data.SqlClient;//添加引用
namespace  DAL
{public class SQLHelper{public  int Query(){//①定义数据库连接字符串string connStr=@"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。今后很多都会有恍然大悟的感觉,每一个阶段的学习,可以注意囫囵吞枣和盲人摸象,等待无结果所以不要纠结。大踏步,前方一定柳暗花明。

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

  1. 牛腩新闻发布系统(一):SQLHelper重构(一)

    导读:在机房重构的时候,就用到了SQLHelper,但那时候即使把代码反复看了很多遍,也看了注释,还和同学交流,也依然是半懂不懂.现在,我再次用到了SQLhelper这个东西,就来说说SQLHelpe ...

  2. 【牛腩新闻发布系统】开发前的准备01

    前言: 牛腩新闻发布系统已经完成了很久了,在完成的过程中,一步步按照视频的步骤在走,中间探索了一下注释部分是怎么出来的.整个学习过程紧凑而且有序,中间也拖沓了两周有开始接着完成,接下来是整个过程中一些 ...

  3. 牛腩新闻发布系统——后台前台整合技术

    在牛腩新闻发布系统中用到了一些技术我就来总结下 一.鼠标超链接设置 一开始就用到了鼠标超链接的设置.尾部样式的设置,这个东西每个网站都要用到非常长用所以可以写下来积累积累. 举个例子 如图:鼠标没有移 ...

  4. 牛腩新闻发布系统——触发器使用

    触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行.触发器经常 ...

  5. 【牛腩新闻发布系统之handler】

    前言: 敲着牛腩已经有很长时间了,一路走来,没有顺顺利利的!正是因为这样,我才感觉自己有了收获!也正是错误的调试,对牛腩新闻发布系统更加了解了!毕竟,错误的调试是一个经历并成长的过程,今天,主要来总结 ...

  6. 牛腩新闻发布系统——制作母板页

    以牛腩新闻发布系统为例,复述Web开发母版页制作: 单击右键--新建项--选择母版页.命名--确定. 这个母版页中包含三部分不变的内容:top(图片).Search(搜索).footer(底部版权) ...

  7. 【Dongle】【Web】牛腩新闻发布系统之中篇

    相对于前篇总结来说,中篇来得晚了很多,大概都一个多月过去了由于牛腩视频已经看完,并跟着敲了下来,故而在这里,我就总结一下视频后40讲的大概知识点. 在前期框架搭建好之后,中期也就是针对每个页面设计符合 ...

  8. 牛腩新闻发布系统—如何发布

    [前言] 牛腩项目的学习已经接近尾声了,到了该发布的时候了,当时看完牛腩老师的发布系统,并没有很懂,就想着先往下走,当看了Asp.Net第一集的时候,就突然明白怎么回事了,其实也没有那么难. [内容] ...

  9. 【牛腩新闻发布系统】系统发布06

    前言: BS系统的发布可以通过VS自带的工具实现,也可以通过windows系统自带的IIS进行发布,我用的第二种方法发布的. 使用的方法: https://blog.csdn.net/j1553341 ...

  10. 牛腩新闻发布系统(2)使用存储过程查询表

    很多人接触数据库,从数据库表中查记录最早应该是利用SQL语句字符串,这也是我们开始操作数据库表使用的SQL语言,那时也看过存储过程,只是不理解存储过程什么意思,现在也只是简单应用,了解一点点而已. 形 ...

最新文章

  1. [置顶]完美简版学生信息管理系统(附有源码)管理系统
  2. pytorch 检索数组
  3. QQ使用了什么通讯协议?为什么要这样做?为什么采用 UDP 协议,而不采用 TCP 协议实现?
  4. Markdown转LaTeX的Python程序大全(持续更新)
  5. JVM中GC小对象配置
  6. 华为手机怎么隐藏按键图标_华为手机8个隐藏功能,快来看看有没有你不知道的...
  7. JS 几种数据类型及其转换
  8. c语言OBJECT数组,Objective-C中NSArray的基本用法示例
  9. 金融公司大量U盾如何管理
  10. Atitit 推广之道 attilax著艾龙著 1. 概念呢 2 1.1. 目的 2 2. 与网络推广相近的概念有网络营销(搜索引擎营销、邮件营销、论坛营销、网站推广、网络广告、SNS营销、微信营销
  11. 电路方案分析(十三)采用 CAN 的汽车分立式 SBC 预升压、后降压参考设计方案
  12. 长尾理论 推荐系统长尾理论
  13. psutil:系统、进程,信息都在我的掌握之中
  14. Vue提示 : Named Route ‘test‘ has a default child route. When navigating to this named route (:to=“{nam
  15. 计算机使用痕迹,彻底清除电脑使用痕迹的方法
  16. 通俗易懂数仓建模:范式建模与维度建模
  17. Java/JavaScript有哪些图形图像处理的框架?
  18. Android之运用百度地图检索地点
  19. 2021-2027全球与中国便携式X射线荧光光谱仪市场现状及未来发展趋势
  20. 算法:(二)枚举(穷举)算法

热门文章

  1. win7安装SQL2005图文教程
  2. mysql必知必会和sql必知必会
  3. 字体编辑用中日韩汉字Unicode编码表
  4. 仿王者荣耀JS示例代码
  5. [5-24]绿色精品软件每天更新[uc23整理]
  6. 软件测试理论-测试用例和设计方法
  7. 写代码会用到哪些常用的软件
  8. JAVA零基础入门书籍推荐
  9. Java反编译生成java文件
  10. javase和java区别_javase和java有什么区别