Как обработать результат SqlCommand (строки) по мере их поступления? - PullRequest
2 голосов
/ 26 октября 2009

Как обработать результат SqlCommand (строки) по мере их поступления? Другими словами, я пытаюсь сделать именно то, что делает Sql Management Studio 2005 при выполнении запроса с несколькими тысячами строк. Мне кажется, как только Sql нашел первый результат, он уведомляет пользовательский интерфейс и отображает строки по мере их поступления ...

Я полагаю, что это можно сделать асинхронно с BeginExecuteReader и EndExecuteReader, однако (в моих тестах) метод обратного вызова вызывается только после завершения набора результатов. Любая идея о том, как копировать то, что делает Sql Management Studio 2005?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 26 октября 2009

Не выполняйте асинхронную операцию, просто вызовите ExecuteReader, а затем выполните итерацию по набору результатов по мере его поступления.

using(SqlCommand cmd = new SqlCommand(......))
using(SqlDataReader rdr = cmd.ExecuteReader())
{
    while(rdr.Read())
    {
        // read and interpret row
        // possibly update GUI or something
    } 
}

Если вам нужно обновить какой-то пользовательский интерфейс или что-то еще во время обработки, вы всегда можете вызвать другой метод с новой строкой, которая была прочитана.

Марк

1 голос
/ 26 октября 2009

Чтобы ваше приложение оставалось отзывчивым, ваш основной поток графического интерфейса должен быть свободен для обработки входящих сообщений. Это даже верно для рисования на экран; Вы можете обновить текст метки, но он не будет отображаться на экране до тех пор, пока не будет обработано сообщение «обновить текст метки».

Простой способ быть отзывчивым - часто вызывать Application.DoEvents (). Это будет в основном обрабатывать все входящие сообщения и возвращать.

Если у вас есть отдельные операции, которые занимают много времени, например, ExecuteReader (), вы не сможете вызывать DoEvents () достаточно часто. В этом случае вы должны вернуться к фоновой теме. Одним из относительно простых способов использования фонового потока является компонент BackgroundWorker. В этом блоге есть хороший пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...