Как обработать результат SqlCommand (строки) по мере их поступления?

2

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

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

Спасибо!

Теги:
ado.net
asynchronous

2 ответа

6
Лучший ответ

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

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

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

Марк

1

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

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

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

  • 0
    Я согласен, чтобы пользовательский интерфейс реагировал, длительные / интенсивные задачи должны выполняться из другого потока. Application.DoEvents () легко, но грязно.
  • 0
    Мой вопрос не о том, чтобы иметь отзывчивый пользовательский интерфейс, я довольно хорошо знаю эти методы. Вопрос об асинхронном Sql и обработке данных по мере их поступления ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню