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

摘要:
现在,我再次用到了SQLhelper这个东西,就来说说SQLHelper是怎么构建的。1,首先看普遍性的D层操作/***********************************************'类名:Class1*'命名空间:SQLHelper*'创建时间:2015/3/513:20:02*'创建人:HXX*'修改时间:*'修改人:*'版本号:4.0.30319.18449*'版权:HHX*'**********************************************/usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;//增添了对数据库的访问操作,增添相应的命名空间//提供对表示ADO.NET结构的类的访问。

导读:在机房重构的时候,就用到了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,引用命名空间usingSystem.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的基本精简编写,就结束了。

四、扩展

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

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

五、个人感受

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

免责声明:文章转载自《牛腩新闻发布系统(一):SQLHelper重构(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇从零开始学装机 编辑教你如何安装CPUcss 透明(transparent)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Odoo学习笔记(一)搭建windows开发环境

前言: 虽然很多人都说学习odoo,最好是linux开发环境,可是我这业余选手有不是只做开发,还有好多活是在windows上做的,我还是做windows开发环境吧。 开始学习Odoo之前,需要具备一些基础知识: 下载git源码、配置python虚拟环境、基本了解数据库服务器的部署和连接、python编程基础知识。 部署Odoo需要掌握Docker,起码知道...

Java 多重catch语句的具体使用介绍

某些情况,由单个代码段可能引起多个异常。处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常。当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行。当一个catch语句执行以后,其他的子句被旁路,执行从try/catch块以后的代码开始继续。下面的例子设计了两种不同的异常类型:// Demonstrate...

influxdb使用

参考:https://segmentfault.com/a/1190000015721780?utm_source=tag-newesthttps://baobeituping.iteye.com/blog/24329401、windows下安装直接解压压缩包2、启动执行influxd.exe3、客户端工具influx.exe4、与传统数据库对比,时间序列...

MSSQL数据库各角色权限

固定数据库角色  描述  db_owner  在数据库中有全部权限。  db_accessadmin  可以添加或删除用户 ID。  db_securityadmin  可以管理全部权限、对象所有权、角色和角色成员资格。  db_ddladmin  可以发出 ALL DDL,但不能发出 GRANT、REVOKE 或 DENY 语句。  db_backup...

ASP.NET Web应用程序修改页面Inherits示例

<@page 中 Codebehind 、Inherits 和aspx的关系 CodeBehind 指定包含与页关联的类的已编译文件的名称。该属性不能在运行时使用。 说明: 提供此属性是为了与以前版本的 ASP.NET 的兼容,以实现代码隐藏功能。在 ASP.NET 2.0 版中,应改用 CodeFile 属性指定该源文件的名称,同时使用 Inher...

SqlServer数据库脱机和分离的区别

脱机和分离的区别: 分离和脱机都可以使数据库不能再被使用,但是分离后需要附加才能使用,而脱机后只需联机就可以用了。 附加数据库报错: 无法打开物理文件 XXX.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误:5120) 解决方法: 找到xxx.MDF与xxx_log.LDF文件和所在的文件夹 右键-属性...