Я подозреваю, что этот ответ в SO, но я не могу его найти. Некоторые отчеты, которые я генерирую из SQL 2008 R2 в приложении WPF, я хотел бы экспортировать в XML. Наиболее распространенное использование XML - это импорт в Excel. Используя TSQL и for xml auto
, я смог создать несколько строк, а затем вручную отредактировать заголовок и корень, чтобы получить действительный документ XML. Мой вопрос заключается в том, как мне создать действительный файл XML с помощью C # .NET 4.0 WPF. Должен ли я просто запросить, используя FOR XML AUTO
, затем использовать XmlReader
, чтобы перебрать строки и записать в файл? Как получить действительные теги первой строки, корня и закрытия?
Из того, что было прочитано для дальнейшей обработки, XMLreader и XMLwriter работают быстрее, чем LINQ XML. XMLwriter также имеет возможность записи непосредственно на диск, так как мне может потребоваться записать до 1 000 000 строк XML. Сейчас я думаю о том, чтобы читать данные с помощью SQLdataReader и писать с помощью XMLwriter. Кто-нибудь думает, что есть более быстрый путь?
Код выложен для Джона Сандерса, когда он проголосовал за то, что я не приложил усилий Позже Джон убрал отрицательное голосование и дал принятый ответ на мой вопрос.
XDocument xDoc = new XDocument(
new XDeclaration("1.0","utf-8", "yes")
, new XComment("Gabriel Extract")
//, new XElement("Documents", new XElement("sDoc", new XAttribute("sID", "1")),
// new XElement("sDoc", new XAttribute("sID", "1")
//)
//)
);
Debug.WriteLine(xDoc);
XElement xElementDocs = new XElement("Documents");
XElement xElementsDoc;
XElement xElementAdd;
using (SqlConnection connection = new SqlConnection(connString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
command.CommandText = "select top 100 sID, sParID, docID, attBeg " + Environment.NewLine +
",[addDate],[mimeType],[caseID],[textSize],[textHash],[nativeFileName],[nativeFileSize]" + Environment.NewLine +
",[nativeMD5],[nativeUNC],[nativeDateCreate],[nativeDateModify],[nativeExtension]" + Environment.NewLine +
"from docSVsys with (nolock)";
SqlDataReader rdr = command.ExecuteReader();
while (rdr.Read())
{
//Debug.WriteLine(rdr.GetInt32(0).ToString());
xElementsDoc = new XElement("sDoc", new XAttribute("sParID", rdr.GetInt32(1).ToString()), new XAttribute("sID", rdr.GetInt32(0).ToString()));
xElementsDoc.Add(new XElement("docID", rdr.GetString(2)));
xElementsDoc.Add(new XElement("attBeg", rdr.GetString(3)));
xElementDocs.Add(xElementsDoc);
}
rdr.Close();
}
xElementsDoc = (from xml2 in xElementDocs.Descendants("sDoc")
where xml2.Attribute("sID").Value == "2"
select xml2).FirstOrDefault();
Debug.WriteLine(xElementsDoc);
xElementsDoc.Add(new XElement("SVtext", "value"));
xElementAdd = new XElement("MVtext1", "value1;value2");
//xElement.Add(new XElement("value", "value1"));
//xElement.Add(new XElement("value", "value2"));
xElementsDoc.Add(xElementAdd);
xElementsDoc = (from xml2 in xElementDocs.Descendants("sDoc")
where xml2.Attribute("sID").Value == "4"
select xml2).FirstOrDefault();
Debug.WriteLine(xElementsDoc);
xElementsDoc.Add(new XElement("SVtext", "value4"));
xElementAdd = new XElement("MVtext1", "value41;value42");
//xElement.Add(new XElement("value", "value1"));
//xElement.Add(new XElement("value", "value2"));
xElementsDoc.Add(xElementAdd);
xDoc.Add(xElementDocs);
//Debug.WriteLine(xDoc);
xDoc.Save(@"C:\temp\xDocGabe.xml");
Также будет сборка и версия XMLwriter и сравнение производительности. Если кто-то выразит и проявит интерес, я поделюсь своими выводами.
Я обнаружил, что эта проблема больше, чем хлебница. Есть 5 таблиц fk для многозначных полей, из которых мне нужно получать данные. Идея заключалась в том, чтобы выполнить 6 запросов, а затем прочитать их, используя набор rdr.nextresult. С точки зрения SQL эффективный подход. Этот подход требует найти элемент, используя where xml2.Attribute ("sID"). Value == "X". На 1000 записей это делается за секунды. На 10 000 это займет минут, и мне нужно, чтобы масштабировать до 100 000. Другая проблема, с которой я столкнулся, заключается в том, что мне нужно, чтобы многозначное значение отображалось как одно значение со значением, объединенным и разделенным символом;; Поэтому мне нужно будет написать SQL, который выравнивает эти столбцы, или написать и преобразовать XML, и я не знаю, как это сделать. Или я могу прочитать результаты таблицы fk в DictionaryList и использовать XMLwriter (звучит как гранж, но DictionaryList работает быстро). Сейчас я добавляю эту функцию с 1000 max и на основе Xdocument. LINQ удобен, но не всегда быстр.