摘要
ADO.NET有两个核心组件:基于连接的Data Provider组件以及基于非连接的DataSet组件。基于连接的Data Provider组件常用于实时地从数据库中检索数据。而基于非连接的DataSet,似乎与数据库没有直接联系,仅仅用于在本地内存中存储Data Provider提供的数据表或集合。这一切似乎很微妙,此时,你是否在想:这两大组件是如何联系在一起的呢?或许,通过阅读本文会或多或少解除你的一些疑惑呢!
目录
1. 认识DataAdapter
前面我所讲的对象中,譬如Connection对象,Command对象以及DataReader对象,这些对象均属于Data Provider的一部分,而且都是基于连接的。拥有强大功能的它们,让你可以很轻松地连接一个特定的数据源,执行SQL语句,检索只读的数据流等等。这些基于连接的对象都对应于特定的数据源。换句话说,对于不同的数据源,我们需要找到对应的数据库提供程序(Data Provider)来匹配他们。当然,你也不必为此感到困惑和紧张,在前面我已经讲得很详细了。或许,以目前我们所学的知识,对于操作数据源以及检索数据完全没有什么问题呢!但是,这并没有发挥出ADO.NET的优势。如果,每次我们检索数据库中的表或者行都需要连接一次数据库,那么性能和效率是十分低下的。实际上,ADO.NET提供了基于非连接的核心组件:DataSet。DataSet组件让我们可以很愉快地在内存中操作以表为中心的数据集合,就好比操作数据库中的表一样。这是多么让人兴奋和激动啊!
不知道大家有没有想过这样一个问题(反正我是想了):既然DataSet是基于非连接的(不需要连接数据库),那么它存储的数据集合是从哪里来呢?实际上,很多时候,它的数据还是来自于数据库。Oh!这似乎有点自相矛盾了!打个“不雅”的比喻:就好比没有鸡,那哪来的蛋呢?你不妨换个角度来思考问题!虽然,你没有养鸡,但是,你不是还可以从超市或者其他零售店买到鸡蛋吗?同理,尽管DataSet没有直接连接数据库,但是,ADO.NET早就为DataSet准备了一位非常谦虚友善的中介:DataApdater。DataApater数据适配器,就是这样一个对象:它为外部数据源与本地DataSet集合架起了一座坚实的桥梁,将从外部数据源检索到的数据合理正确的调配到本地的DataSet集合中。
2. DataAdapter的工作原理
要说DataAdapter是ADO.NET世界里最为复杂的部分,其实也不为过!但是,我们也不必惊慌。尽管DataAdater内部实现机制较为复杂,但是提供开发人员的接口却是异常的简单。我们知道,DataApapter本质上就是一个数据调配器。当我们需要查询数据时,它从数据库检索数据,并填充要本地的DataSet或者DataTable中;当我需要更新数据库时,它将本地内存的数据路由到数据库,并执行更新命令。下面我们以Customer表为例,来理解DataAdapter的工作原理。下图详细描述了一个DataAdapter的工作过程。