2009-06-02 57 views
0

我正在使用一些TSQL和'For XML Auto'。如果我在管理工作室中運行TSQL,我會得到一行。如果我使用DataAdapter.Fill()命令填充DataTable,我會得到兩個結果。看起來結果是在一個標籤的中間分開的。它不是一個巨大的XML文件,實際上它很小(大概20行),所以尺寸可能不是問題。這是SQL。.NET和TSQL「For Xml Auto」分割XML結果

SELECT 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 FROM
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

的結果分開的右中的一個元素

...組織 名稱= \「善普施加拿大\」中間0縮寫= \「\」WebsiteURL = \「http

然後DataTable中的第二行選擇它離開的地方。有任何想法嗎?

回答

1

感謝您的建議傢伙。我想到了。問題不在於sql server(正如我所說的,management studio在一行中正確地返回答案)。添加類型也沒有幫助,(Sql服務器知道它從一開始就是xml)。問題是ADO.NET在創建數據表時破壞了結果。

事實證明,我不應該從Command.ExecuteReader使用SqlDataReader。相反,我應該使用Command.ExecuteXmlReader中的System.Xml.XmlReader。然後,按照您的建議進行操作,將這些結果連接起來(儘管它可能只會使用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相關。 – 2009-06-02 17:42:21

0

正如我記得當我在幾年前用於xml auto時,每行都有一個字符限制,這就是爲什麼引擎將數據拆分爲單獨的行。我認爲你需要連接這些片段,然後才能將它用作任何數據表的源代碼。

0

你可以使用「FOR XML AUTO,TYPE」嗎?它會返回一列「XML」類型。

0

這是sql server的問題,它認爲結果很大時會將結果拆分成多個項目。你必須讀取結果並附加到一個字符串。

我不知道爲什麼這樣的行爲,但我從IDataReader讀取,我很困惑。後來我追加到了一個stringbuilder並得到了輸出xml。我得到一個很大的XML,它分裂了30次。