2011-04-28 75 views
7

我在SQL中有一個表,其中一列是一個XML數據類型。我如何能夠從SQL到ASP.NET(C#)代碼隱藏中獲得它的價值?我想將它作爲Xml類型存儲,而不是字符串類型,因爲我需要操作其中的值和屬性。我試着把它放在一個字符串類型變量上,我得到的是這樣的:AAYYYNYNYNStarLight。我想代之以:如何從SQL表中的列中獲取XML數據?

<ANSWERS> 
<Answer item="ddl_3">A</Answer> 
<Answer item="ddl_8">A</Answer> 
<Answer item="ddl_13">Y</Answer> 
<Answer item="ddl_16">Y</Answer> 
<Answer item="ddl_19">Y</Answer> 
<Answer item="ddl_22">N</Answer> 
<Answer item="ddl_26">Y</Answer> 
<Answer item="ddl_30">N</Answer> 
<Answer item="ddl_34">Y</Answer> 
<Answer item="ddl_38">N</Answer> 
<Answer item="ddl_42">StarLight</Answer> 
</ANSWERS> 

我該怎麼做,並能夠操縱每個節點?我是一個關於XML的完整小白,任何幫助都會被大量使用。 :)

編輯:清理XML

回答

2

我假設你正在使用中獲取數據出來的SQL Server的直線上升ADO.NET,而不是像實體框架的ORM。如果我正確閱讀文檔here,則XML列將作爲XmlReader公開,您可以使用GetSqlXml方法檢索該列。

一旦你有一個XmlReader,你可以使用Load方法直接將它加載到XDocument中。

您可能會感興趣的另一件事是有兩個不同的XML名稱空間,看看這個問題關於XDocument and XmlDocument之間的差異。

+0

我檢查了關於該XDocument.Parse的鏈接,但它只接受字符串類型作爲參數。而我的列是一個Xml類型。如果我將它從XML(SQL數據類型)存儲到字符串xmlValue,則所有xml標記都將消失。所以當我嘗試使用XDocument.Parse(xmlValue)時,它會拋出一個錯誤「該字符串未被識別爲有效的Uri。」 – Rome 2011-04-28 03:53:11

+0

@羅姆:哦,我誤解了你的問題,讓我編輯。 – R0MANARMY 2011-04-28 03:54:44

+0

我實際上有一個使用該XmlReader的問題,因爲我們有一個單獨的類用於所有數據訪問。當我嘗試這種方法時,我得到了「閱讀器關閉時無效嘗試閱讀」。我認爲這是因爲在數據訪問類將xml結果返回到代碼隱藏之後,數據訪問類將關閉XmlReader。無論如何,謝謝你告訴我關於XDocument。它給了我一個替代解決方案。我會將SQL文檔中的XML文檔存儲爲一個字符串而不是XML類型(我知道這不是一個非常優雅的解決方案)。然後,當我檢索它時,我將使用XDocument.Parse:D – Rome 2011-04-28 05:51:35

2

如果你在你的C#代碼做這樣的事情,你一定會正確地從數據庫中讀取XML:

// setup connection string and query statement 
string connStr = "server=(local);database=Test;integrated security=SSPI;"; 
string query = "SELECT XmlContent FROM dbo.XmlTest2 WHERE ID = @ID"; 

// wrap your SqlConnection and SqlCommand in using blocks... 
using(SqlConnection _con = new SqlConnection(connStr)) 
using(SqlCommand _cmd = new SqlCommand(query, _con)) 
{ 
    // setup parameter for _cmd 
    _cmd.Parameters.Add("@ID", SqlDbType.Int).Value = 1; 

    _con.Open(); 
    string contentsOfYourXml = (string)_cmd.ExecuteScalar(); 
    _con.Close(); 
} 

當你把這個字符串到ASP.NET頁面,但是,ASP。 .NET運行時將嘗試進行XSL轉換,並且默認情況下,如果不指定任何內容,則XSLT將僅返回所有元素值 - >這就是您看到的字符串。

但是從數據庫中讀取最明顯的作品就好了!一旦你有了包含你所有XML的字符串,你可以隨心所欲地使用它 - 用Linq-to-XML或其他方法處理它。

1

好吧,經過幾次更深入的研究,我能夠回答我自己的問題。 :d

這裏是代碼:

private void ddl_Eval_SelectedIndexChanged (Object sender, System.EventArgs e) 
{ 
    //Response.Write(ddl_Eval.SelectedValue.ToString() + " " + "value: " + ddl_Eval.SelectedIndex); 

    dtEval = new DataTable(); 
    dtEval = data.GetEvaluation2(); 
    DataView dvEval = dtEval.DefaultView; 

    string xmlDoc = String.Empty; 

    foreach (DataRowView drvEval in dvEval) 
    { 
     if (drvEval.Row["EvaluationID"].ToString() == ddl_Eval.SelectedValue.ToString()) 
     { 
      xmlDoc = drvEval.Row["EvalAnswers"].ToString(); 
     } 
    } 

    XDocument xdoc = new XDocument(); 
    xdoc = XDocument.Parse(xmlDoc); 

    foreach (XElement child in xdoc.Root.Elements("Answer")) 
    { 
     Response.Write(child.Attribute("item").Value + " " + child.Value + "<br />"); 
    } 

} 

現在,我能夠得到答案的價值和屬性項的值。 :D

相關問題