c # SqlDataReader для XElement Эффективно - PullRequest
0 голосов
/ 15 сентября 2011

У меня Sql SP, выполнение которого занимает около 1 минуты, возвращая 25 000 строк данных.(может быть возвращено несколько наборов данных).

В настоящее время попытка преобразовать это в XElement / XDocument для получения нескольких отчетов приводит к тому, что метод c # преобразует это за более чем 30 минут, что требует Sql Connection \ Command Timeout 30минут, что просто слишком много.

Может кто-нибудь помочь разобраться с проблемой / найти, где я могу сделать улучшения для следующего кода преобразования, так как где-то здесь должна быть огромная неэффективность.

Вызов

public void xyzCall()
{
  ....
  XElement result = SqlDataReadertoXML(sqlcommand.ExecuteReader());
  ....
}

Функция преобразования

    private XElement SqlDataReadertoXML(SqlDataReader datareader)
    {
            XElement results = new XElement("ResultSets");

            // Read Next RecordSet
            do
            {
                XElement result = new XElement("ResultSet");
                //Read Next Row in this RecordSet
                while (datareader.Read())
                {
                    XElement datanode = new XElement("Item");

                    // Read Each Column in this RecordSet
                    for (int i = 0; i < datareader.FieldCount; i++)
                    {
                        // Node.Attr("Name") = Column Name, Node.Value = Field
                        if (datareader.GetName(i) != "") datanode.Add(new XElement(datareader.GetName(i), datareader[i].ToString()));
                    }
                    result.Add(datanode);
                }
                results.Add(new XElement(result));
            } while (datareader.NextResult());

            datareader.Close();
            return results;
    }

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Если у вас есть доступ к базе данных, я предлагаю вам изменить SP или написать новый SP, чтобы возвращать данные в предпочтительном формате XML, что будет быстрее. Построение XML в памяти не является хорошей идеей для большого набора данных.

  1. FOR XML AUTO - Простое вложенное дерево XML, в котором каждый столбец представлен как один элемент
  2. FOR XML RAW - каждая строка в наборе результатов преобразуется в общий тег элемента
  3. FOR XML EXPLICIT - для результирующего набора создан предопределенный формат XML
  4. ДЛЯ ПУТИ XML - Большая часть тех же функций, что и в режиме EXPLICIT, но элементы и атрибуты могут быть построены с использованием XPATH-подобного синтаксиса

Ссылка

0 голосов
/ 15 сентября 2011

Я не вижу никакой очевидной проблемы, но я не удивлен, что преобразование 250К строки в xml в памяти может сжечь ваш процессор.

Одна вещь, которую вы можете сделать, это // ize процесса (например, один поток на resultSet)

Я бы вместо этого использовал SQL Server for xml!

...