В С# я использую SqlCommand ExecuteXmlReader()
для вызова хранимой процедуры SQL Server, которая использует «For XML» для возврата больших (1 ГБ +) сложных XML-файлов (множественная иерархия).
ExecuteXmlReader()
возвращает XmlReader
, который я хочу сохранить в файле XML. Для этого я использую XmlWriter
для потоковой передачи данных из XMLReader
в файловую систему.
using (XmlReader xmlFromDatabase = xmlReaderFromDatabase)
{
var settings = new XmlWriterSettings {Encoding = Encoding.UTF8, Indent = true};
using (XmlWriter outputXmlFileToDisk = XmlWriter.Create(fileDirectory + fileName, settings))
{
outputXmlFileToDisk.WriteNode(xmlFromDatabase, false);
}
}
Примечание: я не могу загрузить весь XML в память (XDocument
), так как он слишком велик.
Моя проблема в том, что WriteNode
очень медленный - запись файла занимает несколько часов. Если я уничтожу свое приложение, XML-файл, записанный на диск, будет частично записан, поскольку файл передается на узел за узлом.
Есть ли лучший способ быстрее сохранить XML из XmlReader
, чем из XMLWriter WriteNode
?
(Я знаю, что есть .ReadInnerXml(), но это возвращает строку, которая не подходит для размера XML)
После того, как я экспортирую файл, его необходимо преобразовать (я могу использовать Saxon, поскольку .net framework не показал себя столь эффективным, как мне бы хотелось) и проверить его схему с помощью C#.
SqlStream
иXmlSqlBinaryReader
). Поэтому вы можете напрямую скопировать поток в свой выходной поток, используя такой метод: using-c-sharp" title="потоковая передача данных из столбца nvarcharmax с использованием c Sharp">stackoverflow.com/questions/29672383/ (не пробовал, поэтому не публикую это как ответ) - person Lucero   schedule 11.01.2017PrintXmlValuesViaNVarChar
, в котором показана горячая поддержка потоковой и асинхронной передачи данных XML черезGetTextReader()
: msdn.microsoft.com/en-us/library/hh556234(v=vs.110).aspx - person Lucero   schedule 11.01.2017