Сброс объекта электронной таблицы Gembox в поток при чтении из DataReader

Вот сценарий:

  • У меня есть около 400 тыс. записей в базе данных SQL Server 2008 R2, которые я хочу экспортировать в электронную таблицу XLSX.
  • Приложение представляет собой веб-приложение ASP.NET 4.0.

Я попытался использовать DataTable с ReportViewer, но использование памяти процессом w3wp резко возросло из-за того, что весь DataTable считывается в память.

Я думал, что Gembox Spreadsheet справится с этим сценарием немного лучше, предполагая, что я мог бы использовать DataReader вместо DataTable и просто записать новую строку на лист рабочей книги Excel и сбросить ее через поток HTTP. Но я не могу найти эту функцию нигде в электронной таблице Gembox. Кто-нибудь добился чего-либо подобного с помощью Gembox или любого другого стороннего компонента?


person Valerio Santinelli    schedule 18.06.2013    source источник
comment
Имеет ли смысл выдавать 400 000 записей небольшими порциями, скажем, по 10 000? Таким образом, вы не столкнетесь с проблемой памяти.   -  person Hammad Khan    schedule 01.08.2013
comment
Это имеет смысл, но это невозможно с ReportViewer, так как в конце мне пришлось бы вставлять все в DataTable, что помешало бы реализации, которую вы предложили. То же самое относится и к Gembox.   -  person Valerio Santinelli    schedule 01.08.2013


Ответы (1)


Я только догадываюсь об этом здесь, но вы сможете сделать это с помощью SQLDataReader. SQL DataReader отличается от SQL DataSet. Первый извлекает по одной записи за раз, и для этого требуется живое подключение к БД. Я думаю, это не должно создавать проблем с памятью. Позже извлекается вся таблица сразу, что может резко увеличить использование памяти. Вот хорошая статья от Microsoft, разница между datareader и набором данных

Также обратите внимание, что Excel также имеет ограничения. Кстати, Excel 2007 довольно хорош, может обрабатывать записи 1000k x 16k. Старые версии Excel определенно более ограничены. Ограничение Excel 2007

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

person Hammad Khan    schedule 02.08.2013
comment
Это сработало бы, если бы ReportViewer принял DataReader в качестве входных данных, но похоже, что он работает только с DataSet и DataTable AFAIK. - person Valerio Santinelli; 27.08.2013