SqlDataAdapter与SqlDataReader

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

我特别关注他们的优点和缺点,以及他们的速度和记忆performance。

谢谢

SqlDataReader的:

  • 保持连接打开,直到完成(不要忘记closures它!)。
  • 通常只能迭代一次
  • 是不是更新回数据库是有用的

另一方面,它:

  • 一次只有一条logging在内存中,而不是整个结果集(这可能是巨大的)
  • 就像你可以得到这一个迭代一样快
  • 允许您尽早开始处理结果

SqlDataAdapter的/数据集

  • 让您在加载完数据后立即closures连接,甚至可以自动closures连接
  • 所有的结果都在内存中可用
  • 您可以根据需要多次遍历它,甚至可以通过索引查找特定的logging
  • 有一些内置的系统更新回数据库

代价是:

  • 更多的内存使用
  • 在使用任何数据之前,请等待所有数据加载完毕

所以真的取决于你在做什么,但我倾向于更喜欢一个DataReader,直到我需要的只是一个数据集支持的东西。 SqlDataReader对于绑定到只读网格的常见数据访问情况是完美的。

答案可以相当广泛。

从本质上讲,对我来说,主要的差异通常会影响我决定使用哪种方式,因为使用SQLDataReader,您可以从数据库“stream式传输”数据。 使用SQLDataAdapter,您可以将数据从数据库中提取到可以进一步查询的对象中,并在其上执行CRUD操作。

很明显,对于一个数据stream来说,SQLDataReader要快得多,但是一次只能处理一条logging。 使用SQLDataAdapter,您可以从数据库获取与您的查询匹配的行的完整集合,以处理/传递您的代码。

警告:如果您使用的是SQLDataReader,请务必始终确保您编写正确的代码来closures连接,因为您正在使用SQLDataReader保持连接打开状态。 如果没有这样做,或者在处理结果时出错,closures连接的适当的error handling将会使连接泄漏的应用程序崩溃

请原谅我的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,因此在连接closures后(断开访问),您将可以访问数据。

SqlDataReader是一个快速向前和连接游标,往往比填写DataSet / DataTable更快。

此外,使用SqlDataReader,您一次处理一条logging的数据,并且不会在内存中保留任何数据。 显然,使用DataTable或DataSet,你确实有内存分配的开销。

如果你不需要保存你的数据在内存中,所以只有渲染的东西,去SqlDataReader。 如果要以断开的方式处理数据,请selectDataAdapter以填充DataSet或DataTable。

希望从数据库填充内存中的DataSet / DataTable时使用SqlDataAdapter。 然后您可以灵活地closures/处理连接,将数据表/设置在内存中。 然后,您可以使用数据适配器和InsertCommand / UpdateCommand操作数据并将其持久保存到数据库中。

当想要快速,低内存的脚本数据访问时使用SqlDataReader,而不需要灵活性,例如将数据传递给业务逻辑。 这对于大数据量的快速,低内存使用率检索来说更为优化,因为它不会一次性将所有数据加载到内存中 – 使用SqlDataAdapter方法,DataSet / DataTable将填充所有数据,所以如果有很多行和列,这将需要大量的内存来保存。