В .NET потоковая передача данных из SQL в файл - PullRequest
3 голосов
/ 22 января 2009

Мне нужно получить DataTable из SQL, а затем преобразовать его в XML (я не могу использовать SQL XML) и сохранить в файл. Проблема в том, что размер файла составит 5 ГБ, а у меня недостаточно памяти, чтобы загрузить все и преобразовать его в XML одновременно в памяти. Я знаю, что должен быть в состоянии использовать DataReader для преобразования и передачи данных в поток файлов кусками, но я не знаю, как на самом деле это сделать. Как я могу сделать следующее?

  1. Асинхронно подключаться к серверу SQL
  2. Вызов хранимой процедуры асинхронно
  3. Асинхронное чтение данных из DataReader
  4. Преобразование данных из DataReader в XML и асинхронное сохранение в файл

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

Ответы [ 3 ]

2 голосов
/ 22 января 2009

Зачем вам нужно делать что-то асинхронно? Это может работать лучше, но будет намного сложнее.

Простой способ сделать это:

  • Выполнить запрос для получения DataReader
  • Создание записи XmlWriter в файл
  • Попробуйте прочитать строку
    • Если больше не осталось строк, все готово. (Убедитесь, что вы закрыли устройство записи / подключения и т. Д.)
    • Если вы делаете получите строку, запишите ее в XmlWriter (добавьте элемент или все, что вам нужно сделать).
  • Вернуться к предыдущему шагу.
1 голос
/ 27 июля 2011

Есть ли несколько больших строк (BLOB) или много маленьких строк? Для больших BLOB-файлов эти две статьи содержат код, необходимый для потоковой обработки BLOB-объектов SQL Server из C #:

Первый из них обрабатывает обычные BLOB, второй - с BLOB-объектами FILESTREAM.

Для многих маленьких строк вам ничего не нужно, просто откройте программу чтения и начните потоковую передачу в ваш XmlWriter. Единственная часть, которая может быть асинхронной, - это первоначальное выполнение запроса, когда результаты начинают возвращаться, ваш обратный вызов завершится, и чтение полученного SqlDataReader будет синхронной операцией. Это означает, что поток заблокирован на все время чтения результата и записи в XML-файл, просто нет API ADO.Net, который мог бы избежать этой проблемы. Вы правы в том, что беспокоитесь о том, что это может вызвать проблемы (это будет), но я должен спросить: почему ваша система выполняет такие большие загрузки в файлы XML? Вы хотите сериализовать результат обратно в ответ HTTP?

0 голосов
/ 22 января 2009

Вам нужен XmlWriter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...