XML到数据库,反之亦然

时间:2013-10-16 23:38:34

标签: c# xml linq

我可以轻松地将我的XML插入到我的数据库表中,但我遵循这种令人筋疲力尽的方式,如我的下行代码中使用LINK所见,这是经过完美测试的。但是,我想知道我是否可以使用所有子标记名的迭代来找到读取“Level”节点的所有XML后代元素的方法,因为当我对XML文件进行任何更改时,我将不得不更改一次LINK代码再次,当我使用这种令人筋疲力尽的方式时,我通常会遇到一些错误。请帮助改进此代码:

try
{
    XElement d = XElement.Parse(richTextBox1.Text.ToString());

        var people = (from Level in d.Descendants("Level")
                      select new
                      {
                          ID = Convert.ToInt32(Level.Element("ID").Value),
                          Day1 = Level.Element("Day1").Value,
                          Day2 = Level.Element("Day2").Value,
                          Day3 = Level.Element("Day3").Value,
                          Day4 = Level.Element("Day4").Value,
                          Day5 = Level.Element("Day5").Value,
                          Day6 = Level.Element("Day6").Value,
                          Day7 = Level.Element("Day7").Value
                      }).ToList();
        foreach (var item in people)
        {
            //Insert and Update                    
            datacommand1.CommandText = "Insert Into MyTable(ID,Day1,Day2,Day3,Day4,Day5,Day6,Day7) values(" + item.ID + ","  + "','" + item.Day1 + "','" + item.Day2 + "','" + item.Day3 + "','" + item.Day4 + "','" + item.Day5 + "','" + item.Day6 + "','" + item.Day7 + "')";
            datacommand1.ExecuteNonQuery();                        
        }                    
}

我的XML文件似乎是这样的:

<level>
    <id> 101 </id>
    <Day1> task 1</Day1>
    <Day2> task 2</Day2>
    <Day3> task 3</Day3>
    <Day4> task 4</Day4>
    <Day5> task 5</Day5>
    <Day6> task 6</Day6>
    <Day7> task7 </Day7>

</level>

1 个答案:

答案 0 :(得分:1)

不是为文件中的每个标记声明一个变量,而是可能想要尝试迭代所有这些变量,为每个标记提取名称和值,并在运行时从那些组成SQL语句,无论它们是什么。尝试这样的事情:

IEnumerable<XElement> items = d.Descendants("level").Elements();
string names = string.Empty;
string values = string.Empty;
foreach (XElement item in items)
{
    names += item.Name + ",";
    values += "@" + item.Name + ",";
    IDbDataParameter parameter = datacommand1.CreateParameter();
    parameter.ParameterName = "@" + item.Name;
    parameter.DbType = DbType.String;
    parameter.Value = item.Value;
    datacommand1.Parameters.Add(parameter);
}
datacommand1.CommandText = "INSERT INTO MyTable (" + names.Substring(names.Length - 1) + ") VALUES (" + values.Substring(values.Length - 1) + ");";
datacommand1.ExecuteNonQuery();

这将基于XML结构动态构建命令,并使用其中的数据填充其参数。但这样做依赖于表结构与文件中的结构完全相同的事实,并且在结构发生变化时仍需要手动模式更新,但只要它们同步就可以了。

修改

关于数据类型,我可以想到两个选择。保持原样,无论如何都将所有内容作为字符串发送,并依靠数据库引擎进行解析,验证并将其转换为数字(取决于您使用的数据库,这可能与否,但我想这不是很少见)。或者修改代码以将特殊字段与循环分开(并从中排除)并逐个添加,相应地指定它们的类型。如果数字列是固定的,就像ID一样,这很容易做到,而其他一切都是文本。