Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlDataAdapter与SqlDataReader_C#_.net - Fatal编程技术网

C# SqlDataAdapter与SqlDataReader

C# SqlDataAdapter与SqlDataReader,c#,.net,C#,.net,使用SqlDataAdapter和SqlDataReader从数据库获取数据有什么区别 我特别研究了它们的优缺点以及它们的速度和记忆性能 感谢SqlDataAdapter通常用于填充数据集或数据表,因此您可以在连接关闭(断开访问)后访问数据 SqlDataReader是一个仅快进且连接的游标,通常比填充数据集/数据表更快 此外,使用SqlDataReader,您可以一次处理一条记录的数据,而不在内存中保存任何数据。显然,对于DataTable或DataSet,您确实有内存分配开销 如果您不需要将

使用SqlDataAdapter和SqlDataReader从数据库获取数据有什么区别

我特别研究了它们的优缺点以及它们的速度和记忆性能


感谢

SqlDataAdapter通常用于填充数据集或数据表,因此您可以在连接关闭(断开访问)后访问数据

SqlDataReader是一个仅快进且连接的游标,通常比填充数据集/数据表更快

此外,使用SqlDataReader,您可以一次处理一条记录的数据,而不在内存中保存任何数据。显然,对于DataTable或DataSet,您确实有内存分配开销


如果您不需要将数据保存在内存中,那么对于仅呈现内容,请使用SqlDataReader。如果要以断开连接的方式处理数据,请选择DataAdapter以填充数据集或数据表。

如果要从数据库填充内存中的数据集/数据表,请使用SqlDataAdapter。然后,您可以灵活地关闭/处理连接,在内存中传递数据表/集合。然后,您可以使用数据适配器以及InsertCommand/UpdateCommand操作数据并将其保留回数据库


如果需要快速、低内存占用的数据访问,而不需要灵活性,例如围绕业务逻辑传递数据,请使用SqlDataReader。这对于快速、低内存使用率的大数据量检索更为理想,因为它不会一次性将所有数据加载到内存中-使用SqlDataAdapter方法,数据集/数据表将填充所有数据,因此如果有大量行和列,这需要大量内存才能保存。

答案可能非常广泛

本质上,对我来说,通常影响我决定使用哪个的主要区别是,使用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#:

数据读取器:
  • 将连接保持打开状态,直到完成(别忘了关闭!)
  • 通常只能迭代一次
  • 对于更新回数据库没有那么有用
另一方面,它:

  • 一次内存中只有一条记录,而不是一个完整的结果集(这可能是巨大的)
  • 大约是一次迭代所能达到的最快速度
  • 允许您更快地开始处理结果(一旦第一条记录可用)。对于某些查询类型,这也可能是一件非常重要的事情
数据适配器/数据集
  • 允许您在加载数据后立即关闭连接,甚至可以为您自动关闭连接
  • 所有结果都在内存中可用
  • 您可以根据需要对其进行多次迭代,甚至可以按索引查找特定记录
  • 有一些内置的功能,可以更新回数据库
代价是:

  • 更高的内存使用率
  • 在使用任何数据之前,请等待所有数据加载完毕
所以这实际上取决于你在做什么,但我倾向于选择一个数据阅读器,直到我需要一个只有数据集支持的东西。SqlDataReader非常适合绑定到只读网格的常见数据访问情况


有关更多信息,请参阅。

填充函数在内部使用数据读取器。如果您考虑的是“哪一个更有效?”,那么在一个紧密循环中使用DataReader逐个记录填充收集记录,系统上的负载可能与使用DataAdapter.Fill相同


(System.Data.dll、System.Data.Common.DbDataAdapter、FillInternal。)

数据集是内存中的数据存储,而datareader只是检索数据的媒介。更轻松的是,您可以在DataSet上运行Linq查询,但不能在datareader上运行。实际上,通过一点额外的代码,您当然可以在datareader上运行Linq查询(或至少一个查询)。只需使用迭代器块,在
while(reader.Read())
循环中返回数据读取器强制转换为IDataRecord。这个答案有误导性。如果使用“using”语句包装SqlConnection和SqlDataReader对象(无论如何,您应该这样做,因为它们是IDisposable的),那么连接将自动关闭。您可以将DataSet与SqlDataReader一起使用:只需调用DataSet.Load(SqlDataReader)。@RickNZ不要太快相信使用语句为您关闭东西。他们调用对象的Dispose()方法,而不是它的Close()方法,我至少遇到过一种情况,Dispose实际上没有为我关闭对象。最好在using块中包含对close方法的显式调用。@Cdaragorn MSDN文档通常非常清楚close()与Dispose()的区别。例如,对于SqlConnection,文档说Close()和Dispose()在功能上是等价的。我不反对调用Close(),但是
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
    cn.Open();
    using(var rdr = cmd.ExecuteReader())
    {
        while(rdr.Read())
        {
            //...
        }
    }
}