如何处理SqlCommand结果(行)?

时间:2009-10-26 13:24:16

标签: c# .net sql ado.net asynchronous

如何处理SqlCommand结果(行)?换句话说,我正在尝试完成Sql Management Studio 2005在执行具有数千行的查询时所执行的操作。对我来说,看起来只要Sql找到第一个结果,就会通知用户界面并显示行来......

我认为它可以与BeginExecuteReader和EndExecuteReader异步完成,但是(在我的测试中)只有在结果集完成时才会调用回调方法。有关如何复制Sql Management Studio 2005的功能的任何想法吗?

谢谢!

2 个答案:

答案 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