.NET и TSQL "For Xml Auto" разделяют результат XML - PullRequest
0 голосов
/ 02 июня 2009

Я использую некоторые TSQL с 'For XML Auto'. Если я запускаю TSQL в студии управления, я получаю одну строку. Если я заполняю DataTable с помощью команды DataAdapter.Fill (), я получаю два результата. Похоже, что результаты разбиты в середине одного из тегов. Это не большой XML-файл, на самом деле он довольно маленький (возможно, 20 строк), поэтому размер, вероятно, не является проблемой. Вот SQL.

ВЫБРАТЬ организацию. Имя, Organization.Abbreviation, Organization.WebsiteURL, Organization.AddressLine1, Organization.AddressLine2, Organization.City, Organization.Province, Organization.Country, Organization.PostalCode, Organization.Phone, Organization.Email, Organization.ContactFirstName, Organization.ContactLastName ОТ
StudentLife.MissionWeekOrganization Организация INNER JOIN StudentLife.MissionWeekOrganizationAttendee рег ON Organization.MissionWeekOrganizationId = reg.MissionWeekOrganizationId WHERE (reg.AttendingYear = 2010 AND ReceivedDate НЕ NULL) ЗАКАЗАТЬ Organization.Name FOR XML AUTO

Результаты разбиты прямо на середину элемента

... Организация Имя = \ "Кошелек самаритянина Канады \" Аббревиатура = \ "\" WebsiteURL = \ "http

затем вторая строка в DataTable начинает с того места, где она остановилась. Есть идеи?

Ответы [ 5 ]

1 голос
/ 02 июня 2009

Спасибо за предложения, ребята. Я понял. Проблема не в SQL Server (как я уже сказал, студия управления возвращает ответ правильно в одной строке). Добавление типа также не помогает (сервер Sql знал, что это xml с самого начала). Проблема в том, что ADO.NET разбивает результаты при создании таблицы данных.

Оказывается, мне не следует использовать SqlDataReader из Command.ExecuteReader. Вместо этого я должен использовать System.Xml.XmlReader из Command.ExecuteXmlReader. Затем вы делаете, как вы предложили, объединяя эти результаты (хотя, вероятно, будет достаточно просто объединить все результаты из всех строк, используя метод DataAdapter.Fill).

Таким образом, что-то вроде этого:

              System.Xml.XmlReader rdr = Command.ExecuteXmlReader();
              try
              {
                  System.Text.StringBuilder sb = new System.Text.StringBuilder();

                  rdr.Read();
                  while (! rdr.EOF)
                  {
                      sb.Append(rdr.ReadOuterXml());
                  }

                  result = sb.ToString();
              }
              finally
              {
                  rdr.Close();
              }

Спасибо за помощь!

0 голосов
/ 05 июня 2009

Проверьте это: http://support.microsoft.com/default.aspx?scid=kb;en-us;310378

Вы можете обойти это в SQL (если это вариант), присвоив результат xml переменной типа «xml» и вернув ее.

DECLARE @ResultXML xml

SET @ResultXML = 
 (SELECT ...
  FROM MyTable
  FOR XML AUTO)

SELECT @ResultXML as [MyXML]
0 голосов
/ 02 июня 2009

Можете ли вы использовать "FOR XML AUTO, TYPE"? Возвращает столбец типа «XML».

0 голосов
/ 02 июня 2009

В этом проблема сервера sql, он разбивает результат на несколько элементов, когда считает, что результаты большие. Вы должны прочитать результаты и добавить строку.

Я не знаю, почему это поведение, но я читал из IDataReader, и я был сбит с толку. Позже я добавил к строку строки и получил выходной XML. Я получал большой XML, и он был разделен на 30 раз.

0 голосов
/ 02 июня 2009

Как я помню, когда я несколько лет назад использовал xml auto, в каждой строке было ограничение на количество символов, поэтому механизм разбивает данные на отдельные строки. Я думаю, вам нужно объединить эти фрагменты, прежде чем вы сможете использовать их в качестве источника данных.

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