几乎在每次面试的时候都会被问道这个问题。使用.NET开发当中读取数据应该采用SqlDataReader 还是 DataSet以及对这两者的理解。
先来谈谈我本人对这两者的理解:
1、SqlDataReader:提供一种从 SQL Server 数据库读取行的只进流的方式。无法继承此类。白话解释就是 使用这个对象可以从数据库中读取只读类的数据。所谓只读,可以理解为一头走到死,不撞南墙不回头。就好比割麦机收麦子一样,这一茬过去了后边就没有了。(千万不要理解为数据库中的数据是只读的)
那么在什么情况下我们才会用到SqlDataReader这个对象呢?
首先、从数据库中读取一个实体对象的时候我们可以用到SqlDataReader
其次、读取一系列(列表)数据的时候可以用到SqlDataReader.
需要注意的是。在使用SqlDataReader读取完数据之后要对其进行显式Close.否则他和数据库就一直连接着,占用内存不说,还容易出现问题。
如果使用完成之后显示将其销毁,这个时候他已经不在占用内存等等耗费资源的东西了!
2、DataSet:MSDN(DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。)
白话解释:DataSet 是一个数据集合,是存放在内存中的。相当于一个存放在内存中的数据库(数据集合)并且不依赖于数据库。
相比SqlDataReader,DataSet的好处就是在于数据库断开连接之后。DataSet仍然保存在内存中,可以随意对其进行操作,比如,删除row,合并,追加,修改某个数据等等。
需要注意的是,由于DataSet是读取后可以立刻关闭和数据库的连接,这个时候DataSet就会存在内存中的。所以在等待GC自动回收之前,他一直占用系统资源。对于我们读取列表来说,把这样一堆数据存在服务器内存中显然不是明智的选择。
服务器内存是有限的。程序中如果存在大量没有被GC回收的 DataSet ,后果……….
开发中对于SqlDataReader和DataSet的选择以及取舍
如前文所述,几乎每次面试的时候都会被问道这个问题。我相信very very much 的童鞋对这两者的区别已经相当的了如指掌,甚至达到炉火纯青的地步。
但是,我看到过大多数的程序。包括我如今新的新公司现有的项目,我几乎找不到SqlDataReader的影子。为什么呢?
在这里我有个疑问,也就是为什么大家会选择DataSet而不是SqlDataReader来读取数据? 很显然,如果答案是DataSet更方便那是非常扯淡的!
我在想,是否所有喜欢DataSet的童鞋们对DataSet和SqlDataReader的理解还不够深入?我想不是的。或许是大家对概念性的东西不入尊耳,又或者是企业为了追寻开发效率,又或者大家以为在程序中对一个用DataSet读取出来的列表进行修改删除就是所谓的“可以随意对其进行操作”。
我需要纠正的一点是:此“随意操作”非彼“随意操作”,关于DataSet可以脱离数据库而在内存中随意操作的理解我认为是这样的:“可以对DataSet数据集合中的数据进行一系列的操作。比如合并数据,统计数据,修改数据,删除数据等等(当然这里举例可以不太确切)然后返回一个修改后的DataSet”。而事实上我见到的情况是 :仅仅在页面(画面)显示数据列表,每行数据后边再带个修改,删除等等这种情况仍然是使用DataSet.
关于以上问题。完全可以用SqlDataReader 来替代,因为根本不存在什么在内存中对列表进行操作的情况。为什么不用SqlDataReader 呢?我自认为 DataSet 相比 SqlDataReader 的优点也就只有这么一点点(或许我理解还不够,或许还有别的),但是在上述情景中他这么点有点已经荡然无存,毫无用武之地,为什么还要把他存在内存中来耗费那么一点点系统资源的?
SqlDataReader 相比 DataSet 的优点我相信各位看客都在心里非常非常的清楚。但是实际上很少有人去使用SqlDataReader而偏向喜欢DataSet,我不知道为什么。
或许很大一部分人都还处在刚毕业的水平吧!有或者是别的什么原因。
当我看到公司现有项目中
a、) 没有一个SqlDataReader .全部都是 使用DataSet来做SqlDataReader 的事情
b、) 存在大量可以避免的页面回发
c、) 存在大量无用的ViewState
d、) asp.net 网站前台数据列表显示用的GridView .
的时候我把我的签名改成 “我内伤了!”
或许以上我的说法您不认可,不过没关系。我也抱着学习的态度虚心接受您的建议。
欢迎拍砖。