我想使用C#更新数据库中的xml列

时间:2011-03-29 15:36:07

标签: c# sql-server xml

大家好 从我试图想象如何在我的SQLServer表中更新我的xml列以来一直是这样。好的,为了清楚地理解我想要将每个id增加1。 好的,这是我的Tablename名为Setting(SettingId int pk,Name nVarchar(100),XmlSetting xml)

//我的data.xml

<setting>
<a id=1/>
<b id=2/>
<c id=22>
</setting>

增加此代码的我的C#代码在

之下
XmlDocument xdoc = new XmlDocument();


private void SetAttribute(System.Xml.XmlNode node)//this code is running in the memory
  {

     System.Xml.XmlElement element = node as System.Xml.XmlElement;

      if (element != null)
            {
                int attributeCount = element.Attributes.Count;

                for (int i = 0; i < attributeCount; i++)
                {
                    System.Xml.XmlAttribute attribute = element.Attributes[i];

       if (string.Compare(attribute.Name, "Id", System.StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        int value;
                        if (int.TryParse(attribute.Value, out value))
                        {
                            attribute.Value = (value + 1).ToString();
                        }
                        else
                        {
                            attribute.Value = "1";
                        }
                    }
                }
                int childNodeCount = element.ChildNodes.Count;
                for (int i = 0; i < childNodeCount; i++)
                {
                    SetAttribute(element.ChildNodes[i]);
                }
            }
        }
        public void EditXmlFile()
        {
            xdoc.Load(FILE_NAME);
            SetAttribute(xdoc.FirstChild);
            return;
        }

我要求的是将此代码更新到我的数据库表设置

private void btnUpdate_Click(object sender, EventArgs e)
{

SqlConnection cnn = new SqlConnection("connectionPath");

SqlCommand cmd=new SqlCommand("Update Setting set SettingXml=@Settingxml where settingId=5",cnn);
cmd.Parameters.AddWithValue("@SettingXml","")//this where I am stacked because I am failing
        try
        {
           cnn.Open();
           cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {

            lblmsg.Text = "Error updating Xml " + ex.Message;
        }

}

如何更新我使用上面的函数更新此SettingXml列,因为我想将每个id递增1

2 个答案:

答案 0 :(得分:1)

您必须将更新的XML作为字符串传递给SqlParameter,如下所示:

SqlCommand cmd=new SqlCommand("Update Setting set SettingXml=@SettingXml where settingId=5",cnn);
cmd.Parameters.Add(new SqlParameter("@SettingXml", SqlDbType.Xml)).Value = xdoc.OuterXml;

您可能会发现使用Linq to XML更容易更新XML - XmlDocument不是很容易使用。

此外,您当前的XML无效 - 我们假设它看起来像这样:

<setting>
  <a id="1"/>
  <b id="2"/>
  <c id="22"/>
</setting>

然后你可以像这样使用Linq增加你的id:

XDocument doc = XDocument.Load("test.xml");
doc.Root
   .Elements()
   .ToList()
   .ForEach(node => node.Attribute("id").Value = (Convert.ToInt32(node.Attribute("id").Value) + 1).ToString());

string xml = doc.ToString();

答案 1 :(得分:0)

如果您使用LINQ,这将更容易。正如@BrokenGlass所指出的,Linq to XML使得更新XML更加清晰,而Linq to SQL将使您的数据库更新更加清晰。看起来应该是这样的。

var dbContext = new MyDbContext();
dbContext.Settings.First(s => s.id == 5).XmlSetting = doc.Elements().First();
dbContext.SubmitChanges();

你应该花一些时间学习Linq,因为它会使这样的事情变得如此简单。

希望这有帮助。