Чтение большой строки XML из инструкции TSQL FOR XML в С#.NET

109
11

Имейте команду SQL с FOR XML, которая возвращает один длинный XML как SqlString. Моя проблема заключается в чтении длинной строки XML в .NET С#.


Следующие только считывают первые 2033 символа


    SqlDataReader rdr = command.ExecuteReader();
if (rdr.HasRows)
{
rdr.Read();
Debug.WriteLine(rdr[0].ToString().Length.ToString());
}

Я также пробовал команду .ExecuteScalar и rdr.GetString и все еще получаю первые 2033 символа. Я изменил сортировку, и она все еще усекается в 2033 году, поэтому она вряд ли вызвана плохим характером. Tried rdr.GetSqlXml и получить сообщение об ошибке не может передать SqlString в SqlCachedBuffer.


Если я ограничу SQL возвратом менее 2033 символов, я получу полный допустимый XML. Поэтому я не думаю, что это проблема синтаксического анализа XML, а не просто усечение. Мне не нужен синтаксический анализ XML - это действительно XML из инструкции TSQL, которая мне нужна в качестве строки.


Как я могу прочитать полный XML (как текст)?


Работает TSQL.


    select top 10 docSVsys.sID, docSVsys.docID
, (select top 10 value + '; '
from docMVtext with (nolock) where docMVtext.sID = docSVsys.sID
and docMVtext.fieldID = '113'
order by value FOR XML PATH('') ) as [To]
from docSVsys with (nolock)
order by docSVsys.sID
for xml auto, root('documents')

FOR XML PATH обеспечивает то, что мне нужно и быстро. Я попробовал регулярный запрос, а затем генерировал XML, используя Xdocument, но производительность ужасна даже с более чем 100 строк, так как для поиска в sID необходимо добавить значение To. Думаю, я мог бы написать конкатенацию как функцию SQL, чтобы избежать FOR XML AUTO, но этот запрос с FOR XML выполняется быстро и предоставляет точные результаты, которые мне нужны. Это как получить результат?

спросил(а) 2011-12-12T19:16:00+04:00 8 лет, 11 месяцев назад
1
Решение
137

Это известная проблема: http://support.microsoft.com/kb/310378


Вместо этого используйте ExecuteXmlReader. Основная причина заключается в том, что SQL разбивает возвращаемый XML, поэтому вам нужно прочитать ответ по-разному. У меня была такая же проблема в ADO, используя VBScript.

P.S. Я вижу, как Тим ответил тем же самым ответом, пока я писал.

ответил(а) 2011-12-12T19:25:00+04:00 8 лет, 11 месяцев назад
43

Обертка всего результата в элементе, похоже, работает для меня, а именно:

select (select top 10 docSVsys.sID, docSVsys.docID
, (select top 10 value + '; '
from docMVtext with (nolock) where docMVtext.sID = docSVsys.sID
and docMVtext.fieldID = '113'
order by value FOR XML PATH('') ) as [To]
from docSVsys with (nolock)
order by docSVsys.sID
for xml auto, root('documents'))

ответил(а) 2016-01-14T13:37:00+03:00 4 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема