使用SqlDataAdapter和SqlDataReader从数据库中获取数据有什么区别?
我特别关注它们的优缺点,以及它们的速度和内存表现。
谢谢
但是,DataReader:
但代价是:
因此,实际上取决于您的需求。但我倾向于在需要使用 DataSet 提供的专门支持时才使用它。SqlDataReader 对于只读网格绑定等常见数据访问情况非常适合。
有关更多信息,请参阅官方 Microsoft 文档。
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
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("...", cn))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
SqlDataAdapter通常用于填充DataSet或DataTable,因此在连接关闭后(断开连接访问)您仍然可以访问数据。
SqlDataReader是一个快速向前且连接的游标,通常比填充DataSet/DataTable更快。
此外,使用SqlDataReader时,您一次处理一条记录,并且不保存任何数据在内存中。显然,对于DataTable或DataSet,您需要分配一定的内存空间。
如果您不需要保留数据在内存中,则只需用SqlDataReader进行渲染即可。如果您想以断开连接的方式处理数据,请选择DataAdapater来填充DataSet或DataTable。
Fill函数在内部使用DataReader。如果您的考虑是“哪个更有效率?”,那么在紧密循环中使用DataReader逐条记录填充集合与使用DataAdapter.Fill对系统的负载可能相同。
(System.Data.dll,System.Data.Common.DbDataAdapter,FillInternal.)
while(reader.Read())
循环内以IDataRecord类型返回DataReader即可。 - Joel Coehoorn