ADO.NET乱弹

随手写的数据库课作业,可能有错,看看就好

—————————————————————-

ADO.NET是M$最新的数据访问技术。在windows 2000的技术体系中数据访问技术被称为ADO+――类似于COM+、Form+、ASP+,但是2000发布时只携带了COM+的实现。而随着M$的.NET战略,ADO+最终被用基于.NET的语言所实现,表现为.NET Framework中的一组类库,并命名为ADO.NET。
因为M$善于混淆完全不同技术的特长,ADO.NET被命名了一个类似ADO的名字,然而我们注意到实际上ADO.NET与ADO几乎没有任何关系,这是一个不同的新模型。ADO.NET遵循更通用的原则,不那么专门面向数据库。ADO.NET集合了所有允许数据处理的类。这些类表示具有典型数据库功能(如索引、排序和视图)的数据容器对象。从总体设计上来看,ADO.NET不像ADO模型那样以数据库为中心,这是 ADO.NET 的一大特点。
ADO.NET包含两种数据访问方式――在线的以及离线的。在这里是存在争议的,因为有人认为这两种方式是同样重要的。然而个人观点是,在线模型更多的是为实现离线模型而存在的。当然不否认在线模型在访问小量数据以及悲观并发时的作用(另外当ADO开发人员尝试过渡到ADO.NET上时在线模型可以起到让他们误以为两种技术相似的混淆作用),但从.NET的技术体系上讲离线模型才是被推荐的。以下只讨论离线模型。
DataSet是ADO.NET(1.0版本中)离线模型中存储数据的核心类。DataSet的重要之处在于它不仅包含DB中的data,还包含DB的meta-data。DataAdapter连接数据库填充DataSet时,它同时将DB中的结构信息填充入DataSet,这包括列数据的类型、约束等等。这样就等于在内存中建立了一个数据库的副本――当然只包含小量的数据。而操作这个内存副本就像操作数据库一样――比如可以使用Sql来对其进行检索。
另外DataSet的重要特性是它在其中数据发生修改后,它会保存数据为修改时的副本。这样DataSet天生就是乐观并发的。实际上在DataAdapter连接DB更新DataSet中的数据时,它默认使用乐观并发的策略。
除了在运行时刻填充DB的meta-data外,M$提供一种称为强类型数据集的方式来访问。通过VS.NET中提供的一系列Wizard来在静态时创建一个类型安全的数据库结构映像――强类型数据集。这样我们就可以避免了大量诸如:
r[‘count’] =  (int)r[‘count’] ?C 1;
的操作,而以一种直观的方式来使用DataSet(在.Net语言的Property特性的帮助下):
r.Count = r.Count ?C 1;
然而使用向导的一贯问题在这里依然存在。任何对向导生成代码的修改,在每次重新生成后都不复存在。而且这种代码生成方式给程序员带来测试困难以及不可控感一直广遭诟病。当然如果我们考虑到M$的主要精力总是放在降低程序员的门槛以及不断加强所谓的“快速开发”上,那么以上的行为全都不难理解。
从上我们可以看到在一定程度上ADO.NET超出了一般的数据访问技术。DataSet(特别是强类型DataSet)在DataGrid的辅助下就足以构建一个解决方案。但正如Martin Fowler在PEAA中谈到的,人们经常批评M$的解决方案中没有对象。DataSet实际上是一种被Martin Fowler称为表模块(以及表入口)的业务层+数据源模式,然而在OO被广泛证明价值的今天,想用DataSet+DataGrid来完全代替OO+O/RMapping,可以认为是可笑而愚蠢的――当然我们还是要注意M$的精力主要放在“快速开发”上。
值得注意的是一个多月之前,在Channel9上Ander向我们展示了一个被称为DLINQ的疑似O/RMapping方案(在TSS上有争论)。在ObjectSpace失去音信的时候,这也许是值得每一个.NET开发人员期待的。