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

StackOverflow https://stackoverflow.com/questions/1624759

Вопрос

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

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

Спасибо!

Это было полезно?

Решение

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

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

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

Марк

Другие советы

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

Самый простой способ быть отзывчивым - это часто вызывать приложение.DoEvents().Это в основном обработает все входящие сообщения и вернет их обратно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top