使用SqlDataAdapter和SqlDataReader从数据库获取数据有什么不同?
我特别研究了它们的优点和缺点以及它们的速度和内存性能。
谢谢
发布于 2009-11-04 21:37:53
DataReader:
时进行迭代
另一方面,它:
在内存中,
DataAdapter/DataSet
以下列为代价:
所以这真的取决于你在做什么,但我倾向于更喜欢DataReader,直到我需要只有dataset支持的东西。SqlDataReader非常适合绑定到只读网格的常见数据访问情况。
有关更多信息,请参阅the official Microsoft documentation。
发布于 2009-11-04 21:37:10
这个问题的答案可能是相当广泛的。
从本质上讲,对我来说,主要的区别通常会影响我决定使用哪种方式,那就是使用SQLDataReader时,您将从数据库中“流式传输”数据。使用SQLDataAdapter,您可以将数据库中的数据提取到一个对象中,该对象本身可以进一步查询,还可以在上执行CRUD操作。
显然,对于数据流,SQLDataReader要快得多,但一次只能处理一条记录。有了SQLDataAdapter,您就可以从数据库中获得与查询匹配的行的完整集合,以便使用/传递您的代码。
警告:如果您使用的是SQLDataReader,请始终、始终、始终确保编写正确的代码来关闭连接,因为您将使用SQLDataReader保持连接打开。如果不这样做,或者在处理结果时出现错误的情况下进行适当的错误处理以关闭连接,将会通过连接泄漏您的应用程序。
请原谅我的VB,但这是使用SqlDataReader时您应该拥有的最低代码量:
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
等效C#:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
发布于 2009-11-04 21:36:23
SqlDataAdapter通常用于填充DataSet或DataTable,因此您可以在关闭连接后访问数据(断开连接访问)。
SqlDataReader是一个只快速前进的连接游标,它通常比填充DataSet/DataTable更快。
此外,使用SqlDataReader,您可以一次处理一条记录的数据,并且不在内存中保留任何数据。显然,对于DataTable或DataSet,您确实有内存分配开销。
如果你不需要将你的数据保存在内存中,那么只为了渲染东西,使用SqlDataReader。如果您想以断开连接的方式处理数据,请选择填充DataSet或DataTable的DataAdapter。
https://stackoverflow.com/questions/1676753
复制