如何处理SqlCommand结果(行)?换句话说,我正在尝试完成Sql Management Studio 2005在执行具有数千行的查询时所执行的操作。对我来说,看起来只要Sql找到第一个结果,就会通知用户界面并显示行来......
我认为它可以与BeginExecuteReader和EndExecuteReader异步完成,但是(在我的测试中)只有在结果集完成时才会调用回调方法。有关如何复制Sql Management Studio 2005的功能的任何想法吗?
谢谢!
答案 0 :(得分:6)
不要执行异步操作,只需调用ExecuteReader
然后迭代结果集。
using(SqlCommand cmd = new SqlCommand(......))
using(SqlDataReader rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
// read and interpret row
// possibly update GUI or something
}
}
如果您需要在处理这些UI时更新某些UI,您可以随时使用已读取的新行调用另一个方法。
马克
答案 1 :(得分:1)
为了让您的应用保持响应,您的主GUI线程必须可以自由处理传入的消息。这对于绘制到屏幕来说甚至是正确的;您可以更新标签的文本,但在处理完“更新标签文本”窗口消息之后,它才会显示在屏幕上。
响应的简单方法是经常调用Application.DoEvents()。这将基本上处理所有传入的消息并返回。
如果您需要花费很长时间的单个操作,例如ExecuteReader(),则您将无法经常调用DoEvents()。在这种情况下,你必须回到后台线程。使用后台线程的一种相对简单的方法是BackgroundWorker组件。有一个很好的example in this blog post。