Читать большую строку XML из оператора TSQL FOR XML в C # .NET - PullRequest
6 голосов
/ 12 декабря 2011

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

Далее читаются только первые 2033 символа

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

Я также попробовал command.ExecuteScalar и rdr.GetString и все еще получаю только первые 2033 символа. Я изменил сортировку, и она все еще усекается в 2033 году, поэтому вряд ли это вызвано плохим характером. Попытался 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 обеспечивает то, что мне нужно, и быстро. Я попробовал обычный запрос, а затем сгенерировал XML с использованием Xdocument, но производительность ужасна даже с более чем 100 строками, так как для поиска To требуется поиск по sID. Я думаю, я мог бы написать конкатенацию как функцию SQL, чтобы избежать FOR XML AUTO, но этот запрос с FOR XML быстрый и дает точные результаты, которые мне нужны. Это просто как получить результат?

Ответы [ 2 ]

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

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

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

0 голосов
/ 14 января 2016

Завершение целого результата в выборке, кажется, работает для меня, т.е.

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...