Answers:
另一方面,它:
以:
因此,实际上这取决于您在做什么,但是在需要仅由数据集支持的内容之前,我倾向于使用DataReader。SqlDataReader非常适合绑定到只读网格的常见数据访问情况。
有关更多信息,请参阅正式的Microsoft文档。
while (reader.Read())循环内返回作为IDataRecord的DataReader强制返回。
答案可能非常广泛。
本质上,对我而言通常会影响我使用哪个决策的主要区别在于,使用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())
{
//...
}
}
}
SqlDataAdapter通常用于填充DataSet或DataTable,因此在关闭连接后,您将可以访问数据(断开连接的访问)。
SqlDataReader是一个仅前进和连接的快速游标,通常比填充DataSet / DataTable更快。
此外,使用SqlDataReader,您一次可以处理一条记录,而不会在内存中保存任何数据。显然,使用DataTable或DataSet确实有内存分配开销。
如果您不需要将数据保留在内存中,那么仅用于呈现内容,请使用SqlDataReader。如果要以断开连接的方式处理数据,请选择DataAdapter填充DataSet或DataTable。
想要从数据库中填充内存中的DataSet / DataTable时,请使用SqlDataAdapter。然后,您可以灵活地关闭/释放连接,在内存中传递数据表/设置。然后,您可以使用数据适配器结合InsertCommand / UpdateCommand来操纵数据并将其持久化回数据库中。
想要快速,低内存占用空间的数据访问而无需灵活性,例如在业务逻辑中传递数据时,请使用SqlDataReader。对于大型数据量的快速,低内存使用率检索,这是最佳选择,因为它不会一次性将所有数据全部加载到内存中-使用SqlDataAdapter方法,DataSet / DataTable将充满所有数据,因此如果有很多行和列,这将需要很多内存。