2009-06-02 2 views
0

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

ВЫБРАТЬ Organization.Name, 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 регистрационная Organization.MissionWeekOrganizationId = reg.MissionWeekOrganizationId WHERE (reg.AttendingYear = 2010 И ReceivedDate IS NOT NULL) ORDER BY Organization.Name FOR XML AUTO

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

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

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

ответ

1

Спасибо за предложения, ребята. Я понял. Проблема не в сервере sql (как я сказал, студия управления возвращает ответ правильно в одной строке). Добавление типа тоже не помогает (сервер 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

Конечно, SQL знал, что это XML. Я задавался вопросом, понимает ли ADO.NET, что это был XML вместо строки. Я хотел знать, какой тип этого столбца был до ADO.NET. –

+0

Я понимаю, о чем вы думали. Нет, это не помогло, но, спасибо за предложение. – Daniel

0

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

0

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

0

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

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

0

Проверьте это: 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] 
Смежные вопросы