ASP.NET开发,从二层至三层,至面向对象

昨天Insus.NET有写了一篇博文《WEB控件没有什么所谓好不好,而是用得好不好http://www.cnblogs.com/insus/p/3821644.html  很多网友持意见相左看法,Insus.NET在评论之中也有作出个人回复,见#29与#30楼。

本篇Insus.NET继续再以Web控件来开发,如果你对Web控件无兴趣,只能说声抱歉,可以略过。

数据库是以Access为例。Insus.NET好象从没有有在商业上用过Access数据,全是SQL Server。没有关系,用什么都一样。

接下来,我们将在asp.net网站上,对这个表进行添加,获取数据,更新,删除等一系列操作。每天也许都是重复这些操作,正因为这是最基本功能操作。就是如我们每天吃饭与步行一样。

先实现往数据库插入数据,在.aspx html markup网页上,拉几个TextBox文本框和一个Button铵钮:

可以切换至.aspx.cs写按钮的添加事件ButtonAdd_Click()。由于Item_nbr是一个唯一主键,在添加之前,需要作为判断一下,是否已经存在。如果不存在,可以把记录插入。这需要在写程序时想到的问题。

先看看判断是怎样写?

如果Item_nbr字段值已经存在数据库中。程序会提示并return出添加事件。反之,它会继续跑下面程序:

上面分别应用了OleDbReader和OleDbCommand来判断与执行插入的SQL语句。数据存储入数据库之后,我们需要把想要的数据显示出来,而不是让用户直接去看数据库内的表。
在.aspx网页,拉一个GridView控件:

在网页显示时,数据也一起显示:

在asp.net网页上,我们能有维护数据的功能,如有添加时有可以写错填错,可以编辑更新,或是对一些记录要有删除等。在GridView控件上,添加一列和设置DataKeyNames属性:

下面写一下删除方法的程序:

如果想实现更新的话,它跟获取数据,删除数据的程序一样,只是传入的SQL语句不一样。下面再实现一个功能,就是获取某笔记录某一单独字段值:

事件程序,可以参考:

好了,上面所有功能,是这次Insus.NET想表达的。
说句实在话,Insus.NET在十年前的刚开始学习和使用.NET Framework2.0写asp.net时,不知花上多少努力与时间才写出来。现在回过头写,算得上去车轻路熟。

实时演示一下上面所有功能:

演示完毕,回过头来看看刚才写的代码,有两行代码在每一个方法或是与数据库关联操作,均出现:

对了,这些可以写入Web.config文件中去,以后变更数据库时,可以直接去Web.config文件中修改,不必每一页,每一个函数去找出来改,这样容易漏改,或错改。

这样子,所有那两行代码,均可改为:

Insus.NET使用Replace()方法,去替代数据库路径。

上面所有实现,算得上是两层,页面级的。
这只是一些练习而已。接下来,你又想在数据库添加另一个张表,实存储另外一些数据。如会员,订单等。每张表的处理,基本上均需要实现上面的功能,添加,更新,删除等功能。你想到的方法,照着上面的方法,重新写一份。稍微更好的方法,就是把上面的网页复制一份,改名。然后修改其中的SQL语句即可。

当这些功能要求越来越多,每加一个,就复制一个,改一个。一些代码不停重复地做时,网页也随之不停的澎大,维护起来随之困难。因此我们自不有然地会想到要怎样去重构与简洁它们。

OK,由于这些代码的耦合性很强,我们在学习面向对象时,可以创建一个对象,如BizBase,把这些处理数据库的代码搬移至这个新建的对象中。先从Data_Binding()方法入手,这是从数据库获取数据的方法。

只有高亮块代码是告稳定性,红色箭头是两个变量。我们可以把这两个变量在BizBase定义为属性。

然后把稳定性代码,创建为一个方法:

再来看看Data_Binding()中,是怎样使用这个对象的方法的:

经这样一封装,三层样子已经出来了。处理逻辑的代码已经跑进BizBase这个类中去了。在.aspx.cs中,我们只管传经常性变化SQL语句即可。接下来,我们继续实现删除方法,判断,插入的函数,把稳定性的代码搬移至BizBase对象中。

有了这个类别,我们就可以改写最初写的代码,或是有新建的网页,只要涉及至与数据库的SELECT,INSERT,UPDATE或DELETE时,均可以使用上面的方法。
这也可以算得上我们常说的逻辑层(基本)的。

继续重构与修改网页,先是判断记录是否存在:

添加记录至数据库的方法,重构如下:

删除方法的代码重构如下:

获取标量值的方法重构如下:

刚才经过一系列大整改,大挪移,先休息一下,冲杯Coffee。休息是为了能走更远的路。

现在我们在.aspx.cs网页上看到我们所写的代码,还是两句在几处地方重复出现:

 string mdb = System.Web.Configuration.WebConfigurationManager.AppSettings["mdb"];
string _connectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["InsusConnectionString"].ConnectionString.Replace("mdb", Server.MapPath(mdb));

这样,我也可以把它们移至BizBase类别中去:

写在构造函数public BizBase()上面,把两句改写为一句。由于我们已经把这个connectionstring移至BizBase类了,因此这个类别中的ConnectionString属性拿掉:

在.aspx.cs的网页中,下面的代码已经变得多余了,义不容迟,把它们删除,净化我们的代码:

写到这里,相信你多少了解一些,我们的逻辑类库是怎样产生的。以后不管有多少个表,需要添加,删除,更新或是获取数据(数据集还是标量值),只需实例化BizBase类,传入SQL语句,执行相关的方法。

本篇演示源程序(Access DB; .NET Framework 4.0;):
http://download.cnblogs.com/insus/ASPDOTNET/Asp_OOP.rar

注:文章太长了,写成续集,请关注......

 
 

.NET开发面向对象1的更多相关文章

  1. PYTHON开发--面向对象基础入门

    面向对象 一:面向对象初级 1.思考:首先在python中,以前我们以前用到的几乎都是函数式编程,但是有时候函数式编程其中代码重复利用率太高,我们往往会把这些重复代码写进一个函数日后去调用,所以呢,今 ...

  2. NET开发面向对象2

    面向对象 (2) 继续上一篇<ASP.NET开发,从二层至三层,至面向对象>http://www.cnblogs.com/insus/p/3822624.html .我们了解到怎样把自己的 ...

  3. Python自动化开发 - 面向对象(一)

    本节内容 1.编程范式 面向过程编程 面向对象编程 2.面向对象编程介绍 类的语法 类与实例内存分配 构造方法 自定义方法 3.面向对象特性 一.编程范式 编程是程序员 用特定的语法+数据结构+算法组 ...

  4. python全栈开发-面向对象-初识

    python_16_day 函数总结: https://www.processon.com/view/link/5b718274e4b0555b39e1055f 面向过程的程序设计的核心是过程(流水线 ...

  5. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

  6. PYTHON开发--面向对象基础二

    一.成员修饰符 共有成员 私有成员, __字段名 - 无法直接访问,只能间接访问 1.     私有成员 1.1  普通方法种的私有成员 class Foo: def __init__(self, n ...

  7. python3全栈开发-面向对象、面向过程

    一. 什么是面向对象的程序设计及为什么要有它 1.面向过程 面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种 ...

  8. python3全栈开发-面向对象的三大特性(继承,多态,封装)之继承

    一 .初识继承 1.什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 特点: 子类会“”遗传”父类的属 ...

  9. python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property

    一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...

随机推荐

  1. poj3417 Network 树形Dp+LCA

    题意:给定一棵n个节点的树,然后在给定m条边,去掉m条边中的一条和原树中的一条边,使得树至少分为两部分,问有多少种方案. 神题,一点也想不到做法, 首先要分析出加入一条边之后会形成环,形成环的话,如果 ...

  2. 《Java并发编程实战》第十四章 构建自己的同步工具定义 札记

    一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( &quo ...

  3. XML概要

     早在两年前,我一直听说XML,但是,只是没有时间去研究它.也不知道它的作用,花了一些时间最近几天来学习他们的语言.是XML的一些简介希望能对各位同学有所帮助: XML是eXtensible Ma ...

  4. 14、Cocos2dx 3.0三,找一个小游戏开发Scene and Layer:游戏梦想

    发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director ...

  5. SQL Server 2005 MD5函数

    原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的M ...

  6. BZOJ 1801 AHOI2009 中国象棋 递归

    标题效果:给定一个棋盘.放置一些枪.它需要随机两支枪不能互相攻击,评估的数目p模值 首先,两炮不攻击对方自由地等同于一条线最多可有只有两个枪 直形压力DP话是50分 考虑到每个列是等效 然后我们就可以 ...

  7. HDU 3117 Fibonacci Numbers(围绕四个租赁斐波那契,通过计++乘坐高速动力矩阵)

    HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵高速幂) ACM 题目地址:HDU 3117 Fibonacci Numbers 题意:  求第n个斐波那契数的 ...

  8. 写一个根据id字段查找记录的缓存函数(javascript)

    前不久在参加面试的时候遇到了这样一道题,"写一个根据id字段查找记录的缓存函数,如果之前查过,则直接返回之前查找过的对象,而无须重新查找".当时由于时间较短加上时间比较紧张,考虑并 ...

  9. 【百度地图API】自行获取区域经纬度的工具

    原文:[百度地图API]自行获取区域经纬度的工具 摘要:上一章教大家如何建立自己的行政区域地图.这次为大家提供一个,可视化选择区域,并且能自动生成经纬度代码的工具.工具的源代码完全公开,并且做了详尽的 ...

  10. 深入解析java乱码

    1.什么是编码 ,为什么要编码 先前从没有思考这么深入的问题,觉得一切理所当然,直到有一天java的乱码让我跪了,他不在听我的话,到处是乱码,这次我不打算放过它,我要收拾了它. 大家都知道,文本文件, ...