我想知道,在从数据库中获取数据时,使用DataReader和DataAdapter时需要考虑哪些因素,以及这两者之间的区别是什么,除了DataReader需要打开连接而DataAdapter不需要之外...在我们的项目中,我们在所有的DAL中都使用DataReader,从未使用DataAdapter。所以我想知道,在什么情况下使用DataAdapter + DataTable组合会比使用DataReader更好。谢谢。
我想知道,在从数据库中获取数据时,使用DataReader和DataAdapter时需要考虑哪些因素,以及这两者之间的区别是什么,除了DataReader需要打开连接而DataAdapter不需要之外...在我们的项目中,我们在所有的DAL中都使用DataReader,从未使用DataAdapter。所以我想知道,在什么情况下使用DataAdapter + DataTable组合会比使用DataReader更好。谢谢。
DataReader:当您只想以只读模式获取数据、填充业务实体并关闭读取器时,最好使用它。这真的很快。
比如说,您有一个客户类,想要一个完全初始化的对象,所有客户属性都填好了(例如姓名、地址等)
在这里您将使用DataReader,只需填充实体并关闭读取器即可。
您无法使用DataReader进行更新操作。
DataAdapter:您可以使用DataAdapter读取/更新数据,但是与DataReader相比,读取数据速度较慢。
您可以使用DataAdapter更新数据,但是使用DataReader则不行。
DataReader
允许您处理每条记录并将其丢弃,这在您想要处理许多没有关系的数据记录时非常有用。例如,当您想要从数据库中的每个记录计算一些复杂的统计值或将许多数据记录保存到本地文件中时,您可能会使用DataReader
。
DataAdapter
则不同,它能够让您在内存中拥有数据记录。这使您可以制作GUI来浏览数据、编辑数据等等。它更通用,但不适用于大型数据集。Fill()
和Updater()
,用于从数据库读取数据集并将其写入其中。
请注意,Fill()
会打开连接,使用DataReader获取所有记录,然后关闭连接。
如果没有数据集和数据表,您就没有使用DataAdapters的必要。
所以真正的问题是:您想在DAL中使用什么类型的存储类?数据集是可行且简单的,但它是一种过时的技术(不再改进)。
也许您应该寻找ORM(对象关系映射)库。但这将用一个更复杂的选择替换您的DataReader / Adapter问题。
我从不使用DataReader。
因为我严格分层我的应用程序,我的数据访问层(DAL)负责与数据库通信,我的业务逻辑层(BLL)负责构建对象,所以BLL无法在完成任务后关闭DataReader。相反,BLL会请求DAL提供一个DataSet/DataTable,由DAL来满足这个请求。它通过执行Fill操作(参考TomTom的观点,查看堆栈跟踪,你会看到其中有一个DataReader)来实现这一点。然后BLL对结果集进行喜欢的操作。
我猜这个问题只是在讨论proc和cons,并且离题了
*Data Reader在获取数据方面比DataAdapter快得多,但您必须知道什么是Disconnected mode
*DataReader或Connected mode和DataAdapter Disconnected mode在相同的场景中使用,但有时候在离线模式下更好,因为您可以脱离数据
*但是,断开模式提供了丰富的API,如DataAdapter、DataView、DataTable和DataSet。强大的功能是,您只需为您的DataAdapter提供SELECT、INSERT、UPDATE、DELETE命令,将单个表或多个表的数据附加到您的DataAdapter中,一行代码Adapter.Fill(DataTable)或Adapter.Fill(DataSet),更新数据的方式与之相同Adapter.Update(DataTable)
*在离线模式下更新分层数据比在连接模式下工作要好得多,后者需要使用额外的代码和额外的逻辑来维护,在离线模式下,您可以更新仅插入的行或已更新的行或已删除的行,而更新操作包含在Dot Net Transaction中Adapter.Update(DataTable.Select("","",DataViewRowState.Added))
*在离线模式下,您可以获得数据中每个单独行的版本,此外,您可以将更改应用于您的数据DataTable.GetChanges()
断开模式为您提供了 stronglyTypedDataSet,因此您可以获得数据定义架构和关系,您可以获取父行和子行。
断开模式提供了按主键获取行的方法,还可以使用特定条件获取行 DataTable.Select("FilterExpression","SortOrder",DataRowViewState)。
您可以在 DataTable 上进行计算,而不会干扰服务器的计算,例如选择 productID、ProductName、Price、Quantity、price*quantity 作为 Total,您可以轻松添加具有特定条件(price*quantity)的列。
您可以对抓取的 DataTable 进行聚合,DataTable.Compute("Sum(price)","price>250")。
在断开模式下,您拥有 CommandBuilder,它为您创建 SQL 命令,但它仅适用于单个表。