SqlDataReader或Dataset之间的差异,用于从表中查询数据

时间:2014-08-05 11:06:13

标签: c# dataset sqldatareader

我有一张包含数百万行数据的表格,我想知道哪种方式可以查询我的数据 - 使用.ExecuteReader()或使用Dataset

像这样使用SqlDataReader

myReader = cmd.ExecuteReader();

填写结果列表后

或使用DataSet

using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
    a.Fill(ds);
}

哪种方法最好?

3 个答案:

答案 0 :(得分:4)

这两个对象将在根本不同的情境中使用。

DataReader返回的ExecuteReader实例在使用Read()方法循环之前不会返回任何内容。它是一个连接对象,具有指向后端数据库上当前记录的指针。您可以使用阅读器提供的各种GetXXXXX方法或仅使用索引器来阅读记录的内容。完成当前记录后,使用Read()方法有序地传递给下一个记录。没办法回去或跳到N + 100记录。

DataSet是一个断开连接的对象。它在内部使用DataReader来填充其本地内存缓冲区,其中包含命令文本查询返回的所有记录。如果您需要随机处理返回的数据或在视频上显示或打印它们,这很方便。但是,当然,等待内部阅读器返回数百万条记录可能会非常耗时,而本地内存的消耗可能会在结束前终止您的进程。

那么,哪个最好?如果您的表中有数百万条记录,则需要设置适当的WHERE条件以减少返回的记录数量。说,这取决于你需要对返回的数据做什么。要在网格上显示它们,您可以使用DataSet。相反,如果您需要逐个对记录执行操作,则DataReader会更好。

答案 1 :(得分:1)

问题是你要填写什么

  • 如果您想填写DataSet / DataTable使用DataAdapter.Fill(ds)
  • 如果要填充列表/数组,请使用DataReader和循环

DataAdapter也在幕后使用DataReader,但它会循环所有记录。您可以添加不同的逻辑来仅循环结果集的一部分。

" 我有一个包含数百万行的表":你几乎不需要返回这么多记录。所以不要在内存中过滤,而是在数据库中过滤。

答案 2 :(得分:-1)

两者都是好方法。但是,如果您使用SqlDataReader,则必须关闭它。它是必须的。否则,在SqlDataReader未关闭之前,您将无法执行任何其他查询。