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


    导读:在机房重构的时候,就用到了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,也是一步一步的精简而来。


     

     

     


  • 相关阅读:
    Jmeter学习总结
    WABAPI使用
    EF 学习笔记
    WCF学习笔记
    MVC学习笔记
    IIS使用问题
    CSS学习笔记
    Rotate Image
    Two Sum
    野指针及c++指针使用注意点
  • 原文地址:https://www.cnblogs.com/hhx626/p/6010445.html
Copyright © 2020-2023  润新知