Генерировать XML из SQL - PullRequest
       1

Генерировать XML из SQL

2 голосов
/ 10 декабря 2011

Я подозреваю, что этот ответ в 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 удобен, но не всегда быстр.

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

Я полагаю, вы можете искать предложение ROOT:

SELECT whatever
FROM wherever
FOR XML AUTO, ROOT('rootElementName')
0 голосов
/ 11 декабря 2011

Если ваш ответ был о производительности в простом использовании / компромиссе производительности, то вам определенно следует использовать предложение FOR XML в качестве функций sql-xml, построенных на основе высокопроизводительной библиотеки msxml и хорошо оптимизированных для прямого чтения.

0 голосов
/ 10 декабря 2011

Используйте LINQ to XML для всего, что связано с XML в .NET.

http://msdn.microsoft.com/en-us/library/bb387089.aspx

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