剖析 .Net 下的数据访问层技术(二)

访问|数据

其它

结束ADO.NET剖析前,不得不提提DataReader与DataSet间的兄弟

之争。

就作者所看过的资料,几乎所有的都建议实际情况具体分析,剩下

很少很少的则全凭个人习惯决定。

在学习ADO.NET时,作者也是抱着这样的想法,并反复牢记资料

上总结的那些条款(就像当年学习GOF 23条时那样,几乎可以倒背如

流了J),想到终有一日也可在ADO.NET下大展神威了。

可惜现实不随人愿,连续做了几个项目,无论规模大小,竟然全部

采用了DataSet解决方案!

此时,再回头看看学习ADO.NET时打开最为频繁的PetShop项目,

两相一比较,这才看出些许端倪。

简单的说,PetShop采用了如下这种“曲线救国”的方式来实现数据

交换:

DataReader获取数据 => 创建数据实体类 => 根据字段类型填充数

据实体类 => 将数据实体添加到列表类中(仅针对返回超过一条数据的

场合)

(补充:采用数据实体类或者集合类可以比较方便的实现Cache Manament,

而普通的DataReader由于其数据读取方式限制,无法满足这种需求)

这个过程与DataAdapter.Fill() 所所产生的效果大同小异,只不过,

在Fill() 中DataAdpater自动创建DataReader去获取数据,之后创建

DataTable(相当于数据实体类),并根据字段类型填充DataTable,当然

,如果可能返回多条记录,DataTable完全可以处理,就没必要去实现列

表操作了。

可能读者马上产生了疑问:既然如此,PetShop中为何还需要数据实

体类呢?

这其中还是有一些差别的。

首先,数据实体类是轻量级的structure,一般仅包含数据字段,没有

什么操作方法,这比DataTable或者DataRow还是有一些性能上的优势

(在数据量不大时可以忽略不计);另一方面,数据实体类的操作相对

简单,不需要开发人员具备任何ADO.NET知识(其实就DataTable来

说,这也不算什么问题),点点属性就可以了。

不过,根据作者的实践来看,这两方面似乎还不足以使人转而使用

DataReader方案,理由列举如下:

(1) 对于数据量较大的场合,可以采用分批读取的方式,这有点类似DataGrid的数据分页效果;

(2) 对于简单的数据,实体类还能应付,一旦涉及关联数据,就只能另外撰写方法了。而所有这些,在DataSet中是非常容易处理的(对于企业级应用,大部分情况都需要处理比较复杂的数据);

(3) DataTable“天生”就支持数据集合操作,这样的特性比“集合+实体”的混合模式(PetShop)更容易控制,也更自然;

(4) 实体类在声明时需要确定所有数据类型,当进行数据填充时,就需要DataReader再次关注实体所对应的数据类型,不能有丝毫差错!在这方面,DataTable就显得非常方便,操作时只需要一次类型关注即可;

(5) DataSet解决方案可以非常方便的支持序列化操作(如:Remoting,WebServices),同时,与XML的关系更是亲密无比,这对于和其它系统的交互来说也是至关重要的。

分析过一些技术和方案,相信读者朋友已有一些体会。值此收官之际,如果非要在这里提供一个“综上所述”,那作者的建议就非常明确:

在企业级应用开发中,尽可能的采用DataSet(DataTable / DataView)+ Cache Management解决方案!

其它开发中,只在如下4种情况才考虑使用DataReader(就作者经验来说,大部分使用DataReader都属第2种情况):

(1) 对资源要求比较苛刻的场合,这里的资源主要指内存和数据库连接;

(2) 希望在读取数据库返回结果集时作自定义处理,例如:在读取一条记录后立刻终止处理,或者在读取时作计算操作。

(提示:这种情况类似于XML中的SAX(Simple API for XML)技术,无需一次性读入所有XML数据即可进行操作;相反的,DOM(Document Object Model)则要求必须装载所有XML数据后才能开始操作(MSXML4.0已开始允许只读取XML文档部分数据即可开始操作,这是后话)!)

(3) 只希望得到返回记录数或者返回记录的部分字段,如:

string GetNameByID(int nID) //根据员工ID返回员工姓名,这里只需要

// 读取姓名字段;

(提示:这种情况一般可以通过执行特定的查询或存储过程直接解决)

(4) 出于某些方面的考虑(例如:n-Tier系统中严格区分各Layer间的职责),无法(或者禁止)通过数据库本身进行查询过滤,这时就只有使用DataReader在读取时进行过滤操作!

(提示:虽然DataView也能达到这种目的,但它的过滤前提是必须读取到所有返回数据,所以性能上不如DataReader!)

时间: 2025-01-07 03:08:05

剖析 .Net 下的数据访问层技术(二)的相关文章

剖析 .Net 下的数据访问层技术(一)

访问|数据 l 引言 自从 .NET 真正走入开发人员那天起,"效率"两个字就一直成为众多程序员津津乐道的话题.无论是从开发模式(Cross Language).系统框架(.NET Framework),还是各种使用方便的工具(VS.NET),无一不体现出了它的胜人一筹. 同时,在另一方面,.NET 是否可以真正胜任企业级应用(Enterprise Application)开发的重任,却依然争论不断,褒贬不一. 通常来说,对于一个企业级应用,需要考虑的方面很多,如安全.性能.伸缩性.易

剖析 .Net 下的数据访问层技术(六)

访问|数据 u 其它 Ø ASTA 经常在Delphi下进行网络数据库应用开发或者曾经使用过Borland Midas技术的朋友,对ASTA应该不会陌生. 如果说基于ADO.NET或O/R Mapping来实现DAL是少林.武当的正宗心法,那ASTA就有点明教"乾坤大挪移"的味道:将整个DAL中的Data Access几乎完全扔到了另一个地方(和打回原处稍有区别,但也算另一种挪移J)进行处理! 传统的DAL实现大都是这样的: ASTA则另辟蹊径,额外加入了一个"中间层&quo

剖析 .Net 下的数据访问层技术(五)

访问|数据 Ø Borland ECO 素以提供"多快好省"组件著称的Borland公司在微软发布ObjectSpaces之前率先推出了一套新的开发框架:ECO(Enterprise Core Object),先不说其技术特点,就凭其与建模工具Together的无缝集成,不得不让人佩服Borland在统一开发过程方面所下的功夫. 根据Borland在ECO介绍中的定义,简单说,ECO就是:模型驱动(MDA-Driven)的.Net数据库应用(Database Application)开

剖析 .Net 下的数据访问层技术(四)

访问|数据 Ø Microsoft ObjectSpaces 这是一个在几年前就让众多.NET guy伸长脖子激动不已的技术.就作者来说,那个时候,只要一提起这个话题,一般都是在J2EE guy的嘲笑声中悻悻而归,恨不能自己也搞个ENB(相对EJB)或者NCMP(相对CMP)什么的. 终于,我们可以在.NET Framework 1.2(可在VS.NET 2004Whidbey或Yukon中找到,目前都是Beta版本)中一睹其"芳容"了J. 首先,让我们看看用ObjectSpaces写

剖析 .Net 下的数据访问层技术(三)

访问|数据 u O/R Mapping O/R Mapping的全称是:Object Relational Mapping,主要目的是在传统RDBMS与OO Language之间建映射关系,从而使开发人员彻底脱离数据持久这片剪不断理还乱的苦海. 关于O/R Mapping或者近来比较热门的O/X Mapping(大家可以参考"程序员,2004.01,P86"),可能需要专门的文章进行详细论述,本文的目的主要是对现有方案的优缺点进行简单剖析以及提供一些实践中的参考信息. 相比较J2EE平

CYQ.Data 轻量数据访问层(二) 构造数据单元(上)

DataTable,你有多丰富: 轻轻的打开Reflector.exe,按下F3搜索,输入DataTable,双击定位,右键,Disassemble之后, 悄悄的点一下最下面的 Expand Methods,再从容的把它copy出来,我们才发现..6000多行的代码 我们常用的DataTable一个类,才用了6000多行代码实现,跟我们以前写的,一个类写到一千多,就觉得有点过了 大巫见小巫啊!     解析: 当然了,不是说一个类代码越多,性能就一定不好.至少我们还是那么多人前拥后挤的在继续使用

实战 .Net 数据访问层 - 1

访问|数据 实战 .Net 数据访问层 l 特别说明 本篇实战共分23段,非作者有意如此,乃受CSDN发表文章之64K所限. 虽然有几段根本没有达到64K,但估计是HTML Source超过了这个范 围,所以也不得不单独分段(大都是源代码),请大家谅解. 如果有朋友需要完整文档,请发邮件给我: mailto:xuefeng.zhang@bearingpoint.com l 引言 这次的讨论是上一部分"剖析 .Net 下的数据访问层技术"的一个续,但也可独立成章,为突出主题,作者就特意换

设计.NET应用程序数据访问层五大原则

程序|访问|设计|数据 摘要:大多数使用.NET框架组件工作的开发人员的一个核心工作是实现数据访问功能,他们建立的数据访问层(data access layer)是应用程序的精华部分.本文概述了使用Visual Studio .NET和.NET框架组件建立数据访问层需要考虑的五个想法.这些技巧包括通过使用基类(base class)利用面相对象技术和.NET框架组件基础结构,使类容易继承,在决定显示方法和外部界面前仔细地检验需求. 如果你正在建立以数据为中心(data-centric)的.NET

ASP.NET2.0数据操作之创建数据访问层(1)

asp.net|创建|访问|数据 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研究在ASP.NET 2.0中实现这些常见的数据访问模式之技术的长篇系列教程的第一篇.我们将从创建一个软件框架开始,这个框架的组成部分包括一个使用强类型的DataSet的数据访问层(DAL),一个实施用户定义的业务规则的业务逻辑层(BLL),以及一个由共享页面布局的ASP.NET网页组成的表现层.在打下这个后端的基础工作之后,我们