Фоновое заполнение DataGridView из SqlDataAdapter - PullRequest
3 голосов
/ 11 ноября 2008

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 11 ноября 2008

100 000 строк в сетке данных? просто скажи "нет"!

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

следуйте советам Остина и отображайте только страницу за раз

4 голосов
/ 11 ноября 2008

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

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

2 голосов
/ 11 ноября 2008

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

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

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

0 голосов
/ 11 ноября 2008

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

0 голосов
/ 11 ноября 2008

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

...