2011-12-12 62 views
6

使用FOR XML返回一個單一長XML作爲SqlString的SQL命令。我的問題是將長長的XML字符串讀入.NET C#中。從C#.NET中的TSQL FOR XML語句中讀取大型XML字符串

下只讀取第一個字符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解析 - 它是我需要作爲字符串的TSQL語句中的有效XML。

如何讀取完整的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提供了我需要的和快速的。我嘗試了一個常規查詢,然後使用Xdocument生成XML,但性能很差,甚至超過100行,因爲它需要在sID上搜索以添加To。我想我可以將連接編寫爲SQL函數以避免FOR XML AUTO,但使用FOR XML的查詢很快並提供了我所需的確切結果。這只是如何檢索結果?

+0

確定的SQL返回正確的數據? – gbn

+3

使用ExecuteXmlReader:http://support.microsoft.com/kb/310378 –

+0

此外,這基本上是相同的:http://stackoverflow.com/questions/5423980/how-do-i-return-xml-from -a-stored-procedure –

回答

10

這是一個已知的問題,請參見:http://support.microsoft.com/kb/310378

使用ExecuteXmlReader代替。根本原因是SQL分解了返回的XML,因此您需要以不同的方式讀取答覆。我在使用VBScript的ADO中也遇到了同樣的問題。

P.S.我看到Tim在寫我的同時回答了完全相同的答案。

+3

但是你可以使用rep比我多一點! –

0

結束語整個結果的選擇似乎爲我工作,即:

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')) 
+0

這不適用於OP的問題。問題不在於SQL沒有返回正確的XML,問題是,當您的SQL查詢返回一個大的XML字符串時,它將被.NET框架截斷爲2033個字符。如果你沒有以正確的方式閱讀,你永遠不會得到比前2033個字符更多的字符。 – Chris