1. DataSet和DataReader的区别?
DataReader:和数据库处于一直连接状态。只读只能向前读取,一次只能读取一行信息。DataReader每次只在内存中加载一条数据,内存占用少,高效率!
Dateset:和数据库是断开的离线状态。返回都是数据集,可以对其中的数据做任意操作,DataSet将数据全部加载在内存中,内存占用多,效率稍低。
- DataReader是数据管理提供者类,而DataSet是一般性数据类。
DataSet获取数据需要通过桥梁DataAdapter的填充,由于DataReader本身就是管理提供者,它可以通过Command的ExecuteReader()方法就可以获取数据。
- DataReader是在线处理,当连接关闭后就不能读取数据;DataSet可以离线处理数据,它是把数据从数据库拷贝到本地存储,在关闭连接的情况下仍然可以在DataSet中处理数据,甚至可以在本地存储的表格中增加限制。
- DataReader只能正向读取数据,但不能修改数据;DataSet可以按任何顺序读行,可以按灵活的方式搜索、排序和过滤这些行,甚至可以改变这些行,然后将这些改变同步到数据库中。
- 从DataReader读取数据的速度快于DataSet。
- 由于DataSet是离线处理,所以当在事务处理中要锁定数据库是,不可以使用DataSet。因为当DataSet被填充以后,会自动断开与数据库的连接,此时不可能再对数据库进行锁定。
选择使用DataReader的情形:
1)不需要缓存数据。
2)要处理的结果集太大,内存中放不下。
3)一旦需要以仅向前、只读方式快速访问数据。
2. 委托和事件的区别?
表1 委托和事件的区别
序号 | 区别 | 委托 | 事件 |
1 | 是否可以使用=来赋值 | 是 | 否 |
2 | 是否可以在类外部进行调用 | 是 | 否 |
3 | 是否是一个类型 | 是 | 否,事件修饰的是一个对象 |
在.net中,事件是一种特殊的委托。
- 事件只能在本类型内部“触发”,委托不管在本类型内部还是外部都可以“调用”。
- 在类的外部,事件只能用“+=”和“-=”去订阅/取消订阅,如果是委托的话还可以使用“=”。