SQL-запрос к Excel в C#

Я действительно боролся с этой проблемой. Я пишу программу, которая обрабатывает большие объемы данных, размещенных на сервере в базе данных SQL. В таблице, содержащей 50 столбцов, миллионы записей.

Первое, что делает моя программа, — это выполняет запрос для получения набора этих данных. Размер набора может варьироваться от 500 записей до 1,5 миллиона. 1,5 миллиона — это довольно редко, но бывает. В настоящее время я извлекаю данные и сохраняю их в DataTable, а затем использую EPPlus для экспорта в Excel. У меня начинает заканчиваться память около 150 000 записей. На выполнение всей задачи уходит около 2-3 минут. Я считаю, что мне не хватает памяти при заполнении моей таблицы данных.

Данные находятся на сервере в базе данных SQL, и у нас должен быть экспортированный файл Excel на нашу локальную машину. Эти критерии должны соблюдаться и впредь.

Как же мне это сделать?

Изменить: вот пример кода. Я также должен обновить, что меня не волнует форматирование.

string query = "SELECT * FROM DB.dbo.Table WHERE [Client Name] = '" + clientName + "'";
System.Data.DataTable dt = new System.Data.DataTable();
using (SqlConnection sqlConn = new SqlConnection(connString))
{
     using (SqlCommand cmd = new SqlCommand(query, sqlConn))
{
     sqlConn.Open();
     using (SqlDataReader myReader = cmd.ExecuteReader())
     {
           dt.Load(myReader);
           sqlConn.Close();
     }
}
}

Я думаю, мне нужно внести коррективы в более широкую картину вещей. Как многие из вас говорили, невозможно обработать такое количество строк. Я собираюсь рассмотреть другой подход к проблеме в целом. Спасибо за вашу помощь всем!


person Leyth G    schedule 03.12.2013    source источник
comment
В электронных таблицах Excel есть ограничения по количеству строк. 65 КБ для Excel 2003, 1 мегабайт для 2010 .. не уверен насчет других.   -  person ScottTx    schedule 04.12.2013
comment
Будет невозможно когда-либо экспортировать более 1 миллиона записей в Excel. Это максимальное количество записей, которое Excel позволит разместить в одной книге.   -  person Joel Coehoorn    schedule 04.12.2013
comment
Можете ли вы включить код, чтобы мы могли видеть, что вы сейчас делаете?   -  person Dan Snell    schedule 04.12.2013


Ответы (3)


DataTable здесь явно не поможет. Вы можете использовать StramWriter напрямую без DataTable и писать напрямую в файл CSV вместо файла Excel (ваш вопрос не показывает, что вам нужны формулы, форматирование и т. д.).

Кроме того, это помогло бы поставить себя на место конечного пользователя. Пользователь, вероятно, обнаружит проблемы, связанные с файлом Excel из 1 миллиона строк.

person NoChance    schedule 03.12.2013
comment
Я думаю, что попробую это, так как я не забочусь о формулах или форматировании. Спасибо - person Leyth G; 04.12.2013

Прежде всего, вы уже используете SqlDataReader. Это предназначено для обработки записи за записью. Если вы создадите

while (reader.Read())
{
   // Export row
}

loop, вы не должны сталкиваться с проблемами памяти - однако это может быть медленным.

В приведенной выше части // Export row вы можете захотеть написать на лист Excel с помощью ADO, что в основном сводится к открытию соединения с базой данных для файла SQL и INSERTing, как если бы вы вставляли его в обычную базу данных. На SO должен быть код, чтобы показать вам, как это сделать (например, этот).

[Примечание о том, как я это сделаю:

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

]

Однако, как уже отмечали другие, 1,5 миллиона строк — это не тот объем данных, который может обрабатывать Excel.

person Thorsten Dittmar    schedule 04.12.2013

Если вы устанавливаете значения и форматируете каждую ячейку или каждую строку, это займет время.

Вы всегда должны использовать set_range(A1:A50) = массив строк. Вы можете создать массив строк из 50 строк и установить его с помощью set_range();

Я не знаю об удалении EPPlus, если вы создаете много объектов для установки DataTable и не удаляете его, это приведет к нехватке памяти, поскольку это могут быть не объекты CLR.

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

Для получения дополнительной информации об экспорте sql DataTable в совершенстве

person Laxmikant    schedule 03.12.2013