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
注:文章太长了,写成续集,请关注......
ASP.NET开发,从二层至三层,至面向对象的更多相关文章
- ASP.NET开发,从二层至三层,至面向对象 (5)
此是一系列博文,最后一篇了.也是面向初学者而作,望你们能有更好,更多对ASP.NET面向对编程了解与认识. 前一篇中<ASP.NET开发,从二层至三层,至面向对象 (4)>http://w ...
- ASP.NET开发,从二层至三层,至面向对象 (4)
继续上一篇<ASP.NET开发,从二层至三层,至面向对象 (3)>http://www.cnblogs.com/insus/p/3826706.html .我们更深层次学会了逻辑层对象,即 ...
- ASP.NET开发,从二层至三层,至面向对象 (3)
继续上一篇<ASP.NET开发,从二层至三层,至面向对象 (2)>http://www.cnblogs.com/insus/p/3825805.html .我们学会了怎样创建对象,把Biz ...
- ASP.NET开发,从二层至三层,至面向对象 (2)
继续上一篇<ASP.NET开发,从二层至三层,至面向对象>http://www.cnblogs.com/insus/p/3822624.html .我们了解到怎样把自己的程序由二层变为三层 ...
- 【ASP.NET开发】.NET三层架构简单解析
对于三层架构来说,主要是使用设计模式的思想,对于项目的各个模块实现"高内聚,低耦合"的思想.这里就不做详细的介绍了,如果大家有兴趣,可以阅读软件工程和设计模式相关文章. 对于三层架 ...
- ASP.NET开发,简化与封装
ASP.NET开发,简化与封装 微软的ASP.NET的开发,就是面向对象的编程,当然前端也能体验至面向对象的话,使用Web控件也必须的. 任一控件,我们均可以在后端.aspx.cs或.aspx.vb程 ...
- 专门为ADO二层升三层的咏南中间件(特种用途)
专门为ADO二层升三层的咏南中间件(特种用途) 演示下载:链接: https://pan.baidu.com/s/1bulGBIZ6A1nkeErxIrGsGA 密码: 22dk 解压后运行ynmai ...
- 为方便二层升三层新增的远程方法QuerySql6()
为了方便原来D6,D7开发的二层老程序升级为三层,新增了远程方法QuerySql6().充分地兼容原来二层SQL的写法. 1)公共方法ParamsToStr() function ParamsToSt ...
- DELPHI7 ADO二层升三层新增LINUX服务器方案
DELPHI7 ADO二层升三层新增LINUX服务器方案 引子:笔者曾经无数次在用户的LINUX服务器上创建一个WINDOWS虚拟机,用于运行自己DELPHI开发中间件. 现在再不需要如此麻烦了. 咏 ...
- 下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍
随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个不得不提的是OWIN和Katan ...
随机推荐
- 初次见识结构体与map的区别
题目 http://vjudge.net/contest/view.action?cid=51142#problem/G 自己做的结构体 #include <iostream>#incl ...
- double float的精度问题
三部曲 1: #include <iostream> #include <stdio.h> #include <string.h> using namespace ...
- 转:iOS9的新特性以及适配方案
2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...
- [leet code 165]Compare Version Numbers
1 题目 Compare two version numbers version1 and version2.If version1 > version2 return 1, if versio ...
- wpf 的依赖属性只能在loaded 事件之后才能取到
wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 ...
- XML随笔:语法快速入门及当下流行的RSS简析
今天是本人第一次写博客,之前闭门造车闹出过很多笑话,恰巧这几天刚刚重温了一遍XML的知识,决定把XML的知识再来从头到尾的理一遍,感触颇多,今天分享给大家.希望大家能多多注意其中的要点. 1.定义 首 ...
- 使用Code First建模自引用关系笔记
原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasRequired:前者(A)包含后者(B)一个不为 ...
- 关于nginx部署vue项目的两个问题
首先我使用的是后端接口+前端vue的形式,这样就涉及到跨域的问题.我是这样配置的: server { listen 80; server_name www.liangyp.xyz;//访问网址 loc ...
- 【BZOJ3280】 小R的烦恼(费用流,建模)
有很浓厚的熟悉感?餐巾计划问题? 不就是多了几个医院,相当于快洗部和慢洗部开了分店. 考虑建图: 如果把每一天拆成两个点,一个表示需求,另一个表示拥有的话. 显然就是一个两边的图,考虑如果我现在有人, ...
- docker容器间跨主机通信
http://jnzg905.iteye.com/blog/2269583 https://blog.csdn.net/pingpangbing0902/article/details/7823889 ...