2012-07-11 179 views
0

我有一個存儲過程返回一段XML。當我從MS SQL Management Studio執行它時,它工作正常。 我需要編寫一些C#代碼來執行proc,並生成XML並將其寫入文件。 我寫了代碼,它執行proc(我使用profiler檢查),並且沒有錯誤,但XmlReader是空的。 我的代碼是這樣的:從SQL Server存儲過程獲得空結果存儲過程,返回XML

using (SqlConnection c = new SqlConnection(-snip-)) 
{ 
c.Open(); 
SqlCommand myCommand = new SqlCommand("sp_formfill_contract_xml", c); 

myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.AddWithValue("@i_contract_id", frm_contract_id.Text.ToString());      

System.Xml.XmlReader xmlr = myCommand.ExecuteXmlReader(); 
xmlr.Read(); 


while (xmlr.ReadState != System.Xml.ReadState.EndOfFile) 
    { 
    MessageBox.Show(xmlr.ReadOuterXml()); 
    // do stuff with the XML snippet here 
    } 

    c.Close(); 
    } 

作爲對比測試我創建了一個第二存儲過程返回包含該第一PROC生成XML純字符串,和C#代碼接收就好,只要我不使用XML閱讀器。所以這與XML proc返回的數據類型有關,這使得它看起來是空的。

任何想法? -Sean

+0

什麼版本的sql-server?你是否以XML的形式返回select? http://www.mssqltips.com/sqlservertip/1077/returning-xml-result-sets-with-sql-server/或作爲純文本(varchar)? – 2012-07-11 14:08:10

回答

0

我沒有看到它不應該工作的原因我唯一的猜測是你必須有一行,你已經去調用xmlr.Read()的endoffile;所以請嘗試以下方式

using(System.Xml.XmlReader xmlr = myCommand.ExecuteXmlReader()) 
{ 
while xmlr.Read()) 
{ 
    MessageBox.Show(xmlr.ReadOuterXml()); 
} 
} 
+0

謝謝。我嘗試了你的建議,但得到了同樣的結果。至少,while()從不計算爲真,所以Read必須返回EOF。我並不想對XML做任何事情,我只是想將它存儲在一個String或一個文件中,以便我可以用它覆蓋現有XML文件的內容。我不打算對內存中的XML進行任何分析。也許有更好的方法來做到這一點?你知道是否有辦法告訴SQL Server以字符串的形式返回結果嗎? – user1517963 2012-07-12 08:45:00

+0

您可以將xml轉換爲sql中的字符串,如下所示:CONVERT(VARCHAR(100),@ xml,1);如果多數民衆贊成在 – HatSoft 2012-07-12 09:15:11

+0

之後你再次感謝。我嘗試過這個。但它沒有任何區別。我很困惑!另一個我編碼的過程,它只是返回一個硬編碼的XML,可以正常工作,但是這個使用'FOR XML'子句的過程然後在將結果傳回之前將結果轉換爲VARCHAR不起作用。 – user1517963 2012-07-12 10:03:17