我有一张包含数百万行数据的表格,我想知道哪种方式可以查询我的数据 - 使用.ExecuteReader()
或使用Dataset
。
像这样使用SqlDataReader
:
myReader = cmd.ExecuteReader();
填写结果列表后
或使用DataSet
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
a.Fill(ds);
}
哪种方法最好?
答案 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未关闭之前,您将无法执行任何其他查询。