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

一、Why?(为什么用)

1,首先看普遍性的D层操作

<span style="font-size:18px;"><span style="font-size:24px;">/**********************************************
* '类名:Class1
* '命名空间:SQLHelper
* '创建时间:2015/3/5 13:20:02
* '创建人:HXX
* '修改时间:
* '修改人:
* '版本号:4.0.30319.18449
* '版权:HHX
* '**********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//增添了对数据库的访问操作,增添相应的命名空间 //提供对表示 ADO.NET 结构的类的访问。包含的是一些数据库操作所需要用到的普通数据,如数据表,数据行等
using System.Data; //为 SQL服务器.NET Framework 数据提供程序。包含有关专门操作SqlServer数据库的类,如SqlConnection,SqlCommand,SqlDateAdapter等.
using System.Data.SqlClient;
namespace SQLHelper
{
public class SQLHelper
{
public int ExecuteNonQuery()
{
//数据库链接字符串
string connStr = @"server=(local);database=newssystem;uid=sa;pwd=123456";
//实例化SQLConnection,并通过字符串链接数据库
SqlConnection conn = new SqlConnection(connStr);
//打开链接
conn.Open();
//执行的SQL语句
string sql = "insert into category(name)values('hhx')";
//实例化命令(执行SQL,在conn链接的数据库里)
SqlCommand cmd = new SqlCommand(sql, conn);
//定义变量
int res = cmd.ExecuteNonQuery();
//关闭链接
conn.Close();
//返回执行更新行数
return res;
}
}
}
</span></span>

2,解释说明

基本上,每次在D层对于数据库操作,都要经历这么一个阶段:链接—打开—执行—关闭—返回。如果只有一个方法,一个类,那么写一次是不要紧的,但如果有很多的话,就非常的累。这时候,就需要对于每次的数据库操作进行抽象重构,以便于我们的D层更为轻便。

二、重构步骤

1,数据库的链接

首先:每次的操作,都要进行数据库链接,这个公共的特性,可以单写出一个方法专门进行数据库链接。

<span style="font-size:18px;"><span style="font-size:24px;"> /// <summary>
/// 通过构造函数,给SQLHelper的属性附初值
/// </summary>
public SQLHelper()
{
<span style="white-space:pre"> </span>string connStr = @"server=(local);database=newssystem;uid=sa;pwd=123456";
<span style="white-space:pre"> </span>SqlConnection conn = new SqlConnection(connStr);
}</span></span>

其次:在这里,就已经对于数据库链接进行了初步的精简。但通过定义变量的方式,又将数据的链接写死在了程序里。所以,为了进一步解耦,需要引入配置文件,便于数据库的更改。

注意:1,引用命名空间using System.Configuration,2,配置文件在Web层里自行配置。

<span style="font-size:18px;"><span style="font-size:24px;"><span style="white-space:pre">	</span>public SQLHelper()
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
conn = new SqlConnection(connStr);
}</span></span>

2,打开关闭数据库

在对数据库进行链接之后,还需要打开它,在对其操作结束后,还要关闭。这是在每一次操作时,都需要用到的,所以,这个地方可以精简。

<span style="font-size:18px;"><span style="font-size:24px;"><span style="white-space:pre">	</span>private SqlConnection GetConn()
{
//如果数据库关闭,则打开
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
}</span></span>

三、精简结果

每次执行的SQL语句,可以通过一个变量从D层传入,所以在方法中,引入一个形参sql。

<span style="font-size:18px;"><span style="font-size:24px;">        /// 该方法执行传入的SQL增删改语句(无参)
/// </summary>
/// <param name="sql">要执行的SQL增删改语句或存储过程</param>
/// <returns>返回更新的记录数</returns>
public int ExecuteNonQuery(string sql)
{
int res;
try
{
SqlCommand cmd = new SqlCommand(sql, GetConn());
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{ throw ex;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
} return res;
}
</span></span>

到目前为止,对于SQLHelper的基本精简编写,就结束了。

四、扩展

在上面,我们使用了Try Catch语句,但我们发现在最后关闭数据库的时候,又重复了写了一遍if语句,那么,这一段有没有方法精简呢,答案是:使用Using语句。

PS:在这篇博客中,只是简单的对于SQLHelper进行了外形上的处理,还有内容上的处理:比如:参数化查询,执行存储过程等。敬请期待下一篇吧!

五、个人感受

之前一直在用,但一直都不知道它是怎么来的,自己也写不出来。但真的是:万丈高楼平地起。带来了很大便利的SQLHelper,也是一步一步的精简而来。

牛腩新闻发布系统(一):SQLHelper重构(一)的更多相关文章

  1. 牛腩新闻发布系统--学习Web的小技巧汇总

    2014年11月10日,是个难忘的日子,这一天,小编的BS学习开始了,BS的开头,从牛腩新闻发布系统开始,之前学习的内容都是CS方面的知识,软考过后,开始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...

  2. DRP PK 牛腩新闻发布系统

    一.JSP与ASP (1)Web服务器的支持:大多数通用的Web服务器如:Apache.Netscape和Microsoft IIS都支持JSP页面,只有微软本身的Microsoft IIS和Pers ...

  3. 牛腩新闻发布系统(二):SQLHelper重构(二)

    导读:在上一篇博客中,介绍了简单的SQLHelper重构,即数据库链接,打开和关闭链接的优化等.现在,将介绍参数化查询和执行命令类型的改造. 一.必要性 1,参数化查询 在上篇博客中,在查询的时候,仅 ...

  4. 牛腩新闻发布系统(五):VS网站发布及常见问题

    导读:在千万个回眸中,终于看见了牛腩的归途.好吧,牛腩该整合的都整合完毕了,到了发布的时候了.这时候,不得不再次感慨那句不知道感慨了多少次的感慨:为什么,我要遭遇这么多的坎坷?下面,结合自己的情况,说 ...

  5. 牛腩新闻发布系统(三):CSS盒子模型及其基本内容

    导读: 这些天一直在做牛腩的网页,比如什么首页.出错页.新闻内容页等.在学习的不断推进中,一些刚开始理解的不是很好的东西,也逐渐的深刻了起来.下面,就对这一段时间的学习,做一个总结.主要总结内容有:盒 ...

  6. WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping——牛腩新闻发布系统

    VS2011使用验证控件出现" WebForms UnobtrusiveValidationMode 需要"jquery"ScriptResourceMapping.请添 ...

  7. 牛腩新闻公布系统--学习Web的小技巧汇总

    2014年11月10日,是个难忘的日子.这一天.小编的BS学习開始了.BS的开头,从牛腩新闻公布系统開始.之前学习的内容都是CS方面的知识,软考过后.開始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...

  8. 【NodeJS 学习笔记04】新闻发布系统

    前言 昨天,我们跟着这位大哥的博客(https://github.com/nswbmw/N-blog/wiki/_pages)进行了nodeJS初步的学习,最后也能将数据插入数据库了 但是一味的跟着别 ...

  9. News新闻发布系统

            News新闻发布系统分页的实现 1.首先我们要在NewsDAO中创建一个方法,返回List<NewsEntity>集合,其中pageIndex表示当前页,pageSize表 ...

随机推荐

  1. Nacos部署中的一些常见问题汇总

    开个帖子,汇总一下读者经常提到的一些问题 问题一:Ubuntu下启动Nacos报错 问题描述 使用命令sh startup.sh -m standalone启动报错: ./startup.sh: 78 ...

  2. 惊人的CSS和JavaScript动画logos例子

    https://codepen.io/lindell/pen/mEVgJP Stack Overflow logo是我最喜欢的logo之一,因为它非常简单,但易于识别.并且这个片段动画点击预览Stac ...

  3. 对话框窗口最大化盖住任务栏问题!OnGetMinMaxInfo,WM_GETMINMAXINFO

    http://hi.baidu.com/csacer/item/37cd6ac2dec18d360831c6a7 在写程序时,如果包含了标题栏,但是没有包含最大化按钮或者最小话按钮,那么人工用Show ...

  4. XML文件的解析和序列化

    序列化: private void createXml() { XmlSerializer serializer = Xml.newSerializer();// xml文件生成器 File file ...

  5. vue+element ui项目总结点(四)零散细节概念巩固如vue父组件调用子组件的方法、拷贝数据、数组置空问题 等

    vue config下面的index.js配置host: '0.0.0.0',共享ip (假设你的电脑启动了这个服务我电脑一样可以启动)-------------------------------- ...

  6. codevs 2776 寻找代表元

     时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold     题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用1到n编号.广州二中苏元实验 ...

  7. C++通讯录

    C++通讯录1.0 历时一天,终于把通讯录写好了. 项目要求: 编写一个通讯录管理程序. 有一已存在的通讯录文件,数据内容为各联系人信息. 每个联系人信息的组成部分为: 姓名.电话号码和住址 等个人基 ...

  8. Google Colab免费GPU使用教程(一)

    一.前言 现在你可以开发Deep Learning Applications在Google Colaboratory,它自带免费的Tesla K80 GPU.重点是免费.免费!(国内可能需要tz) 这 ...

  9. 单表操作ORM

    博客园 首页 新随笔 联系 管理 订阅 随笔- 0  文章- 339  评论- 29  Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 ...

  10. Jarvis OJ-Level4

    借助DynELF实现无libc的漏洞利用小结 #!/usr/bin/env python # coding:utf-8 from pwn import * elf = ELF('level4') wr ...