2008-11-10 4 views
3

У меня есть большой набор данных (более 100 000 записей), которые я хочу загрузить в DataGridView. Хранимая процедура, которая выполняет это, может занять 10 секунд или больше.Фон, заполняющий DataGridView из SqlDataAdapter

До сих пор у меня есть BackgroundWorker, препятствующий блокировке пользовательского интерфейса и реализованный рудиментарный диалог «Пожалуйста, подождите».

Что бы я хотел сделать, так это заполнить DataGridView результатами, поскольку они каким-то образом возвращаются из базы данных. Лучший способ описать это - как это делает SQL Server Management Studio - когда запрос выполняется, строки возвращаются немедленно, даже если запрос все еще выполняется. Также есть кнопка, чтобы остановить запрос и сохранить возвращаемые строки.

Как я могу это сделать в своем собственном коде?

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

ответ

4

100 000 строк в datagridview? просто сказать нет"!

  1. пользователь не может видеть 100000 строк в то время
  2. сети трафик для передачи 100000 строк не является незначительным
  3. накладные расходы памяти 100000 DataGridView строк не является незначительным
  4. пользователю нужно только выбрать один ряд и перейти на
  5. если это приложение постоянно используется более чем одним пользователем сразу, DBA будет выследить вас

следовать советам Остина, и отображать только постранично

+0

5. заставил меня смеяться :)) – 2009-09-16 19:58:21

0

Я сомневаюсь, что вы можете сделать это в DataGridView так же, как и Management Studio. Я бы сказал, что вы сразу получаете все строки в своем приложении, когда завершается вызов хранимой процедуры.

4

Кажется, что лучшим вариантом было бы использовать какой-то механизм подкачки, поэтому вы показываете пользователю только определенное количество данных за раз. Это ускорит поиск данных и загрузку страницы. Вы можете использовать встроенный пейджинг GridView (я бы рекомендовал использовать кэш .NET с этим подходом, потому что он каждый раз извлекает весь набор данных, даже если он отображает только страницу записей). Вы также можете реализовать подкачку с LINQ to SQL, где вы одновременно захватываете страницу. Ниже приведена ссылка на хорошую статью, которую я нашел недавно, которая объясняет, как это сделать.

http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx

0

Вы также можете посмотреть в какой-то настройки серверной, а также. Добавление индекса в таком случае помогло нам много раз. Попробуйте запустить хранимую процедуру из SQL Server Management Studio с включенной опцией «План выполнения». Ищите места, где хранимая процедура может увязнуть (т. Е. Высокие проценты выполнения). Когда вы наводите курсор на элементы, вы увидите список деталей выполнения. В нижней части списка посмотрите, сравниваются ли какие-либо поля. Это мертвые подарки для индексации кандидатов.

2

Как было предложено другим, показывая 100K записей в сетке звучит как плохая идея, но если вы действительно должны ...

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

Имейте в виду, что любая польза от использования отдельного потока, чтобы поддерживать отзывчивость пользовательского интерфейса, будет сведена на нет, так как она будет занята, постоянно добавляя строки в любом случае. Я предлагаю вам реализовать какой-то пакетный подход, а пользовательский интерфейс добавлять новые строки только один раз в секунду или около того. Вы захотите быть очень осторожными здесь и учесть возможное состояние гонки. Возникает ситуация, когда ваш фоновой рабочий добавляет строки из datareader в какую-то коллекцию, и ваш пользовательский интерфейс может захотеть прочитать коллекцию одновременно - это почти наверняка приведет к проблемам.

Смежные вопросы