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

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

概述      个人重构的时候,虽说都用上了sqlHelper,但是不认识它的前世今生,所有总感觉很突兀。看牛腩的时候,才恍然大悟。SQLHelper 从名字就能知道,它是和数据库有关系的,并且能帮助到数据库。这样一想,当再理解到“SQLHelper 用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常

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

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

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

<pre  @R_419_6889@="code">using System.Data;//添加引用using System.data.sqlClIEnt;//添加引用@R_419_6889@space  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(@R_419_6889@) value('提高班')";            //⑤命令执行对象 需要SQL语句和conn命令 固定语句            sqlCommand cmd=new sqlCommand(sql,conn);            //⑥执行 返回int  固定语句            int res=cmd.ExecuteNonquery();            //⑦关闭连接 固定语句            conn.Close();            return res;        }    }}

 



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

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

<span >using System.Data.sqlClIEnt;//添加引用using System.Configuration;//添加引用@R_419_6889@space 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 > string sql = "insert into category(@R_419_6889@) values(@ca@R_419_6889@)";            sqlParameter[] paras = new sqlParameter[]{                        new  sqlParameter("@ca@R_419_6889@",ca@R_419_6889@)};</span>


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

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

所以只考虑三个问题:

一 :哪里重复

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

三:变化的部分写在哪里

总结

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

总结

以上是内存溢出为你收集整理的【牛腩新闻发布系统】一步步演化的SQLHelper全部内容,希望文章能够帮你解决【牛腩新闻发布系统】一步步演化的SQLHelper所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1272449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存