我有一个包含数百万行数据的表,我想知道查询数据的最佳方法是使用.ExecuteReader()
还是使用Dataset
。
像这样使用SqlDataReader
:
myReader = cmd.ExecuteReader();
在填写结果列表后
或者使用DataSet
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
a.Fill(ds);
}
哪种方法是最好的?
发布于 2014-08-05 03:19:01
这两个对象将在完全不同的上下文中使用。
由DataReader
返回的ExecuteReader
实例在使用Read()
方法循环之前不会返回任何内容。它是一个连接的对象,它具有指向后端数据库上当前记录的指针。您可以使用读取器提供的各种GetXXXXX
方法或简单地使用索引器读取记录的内容。在处理完当前记录之后,可以使用Read()方法有序地传递到下面的记录。没有办法回去或跳到记录N+ 100。
相反,DataSet
是一个断开连接的对象。它在内部使用一个DataReader
来用命令文本查询返回的所有记录填充其本地内存缓冲区。如果您需要对返回的数据进行随机处理,或者在视频上显示数据或打印它们,这是非常方便的。当然,等待内部阅读器返回数百万条记录可能很费时,本地内存的消耗可能会在结束之前扼杀您的进程。
那么,哪个是最好的?如果表中有数百万条记录,则两者都不需要设置适当的WHERE
条件,以减少返回的记录数量。也就是说,这取决于您需要对返回的数据做什么。要在网格上显示它们,您可能需要一个DataSet。相反,如果您需要一个接一个地执行记录上的操作,DataReader会更好。
发布于 2014-08-05 03:09:34
问题是你想填什么?
DataSet
/DataTable
,请使用DataAdapter.Fill(ds)
DataReader
和循环DataAdapter还在幕后使用DataReader,但它循环所有记录。您可以添加一个不同的逻辑来只循环结果集的一部分。
“我有一个有上百万行的表”:您几乎不需要返回这么多记录。所以不要在内存中过滤,而是在数据库中过滤。
发布于 2014-08-05 03:08:01
这两种方法都是好方法。但是如果你使用SqlDataReader,你必须关闭它。这是必须的。否则,在SqlDataReader未关闭之前,您将无法执行任何其他查询。
https://stackoverflow.com/questions/25137295
复制相似问题