【问题标题】:Differences between SqlDataReader or Dataset to query data from tableSqlDataReader 或 Dataset 从表中查询数据的区别
【发布时间】:2014-08-05 11:06:13
【问题描述】:

我有一个包含数百万行数据的表,我想知道查询我的数据的最佳方法是使用.ExecuteReader() 还是使用Dataset

像这样使用SqlDataReader

myReader = cmd.ExecuteReader();

然后用结果填充列表

或使用DataSet

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

最好的方法是什么?

【问题讨论】:

  • 真正的问题是:你的 sql 命令文本有 WHERE 吗?永远不要考虑读取数百万条记录
  • 如果你想填写DatasSet/DataTable使用DataAdapter.Fill(ds),否则使用SqlDataReader
  • 无论您选择何种读取器/数据集方法,仅读取数百万行都不是一个好的选择。
  • 另外,除了“没有充分理由不要读取数百万行”之外,我想说 DataTable / DataSet 很少是数据模型的正确选择。例如,您是否考虑过

标签: c# dataset sqldatareader


【解决方案1】:

这两个对象将在完全不同的上下文中使用。

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

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

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

【讨论】:

  • 史蒂夫+1说真的很好。对我来说,如果您只需要读取数百万行而不进行任何过滤,无论哪种方式都会影响性能。
【解决方案2】:

问题是你要填什么

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你必须关闭它。它是必须的 如果您使用MultipleActiveResultSets 键作为连接字符串,则不是这样。
    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 2015-11-25
    • 2010-09-05
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多