我可以轻松地将XML插入到我的数据库表中,但是我遵循这种非常累人的方式,就像在我的下行代码中看到的那样,使用了链接,这是经过完美测试的。但是,我想知道是否能找到一种方法来读取"Level“节点的所有XML后代元素,使用所有子标记名的迭代,因为当我对XML文件进行任何更改时,我将不得不再次更改我的链接代码,通常在使用这种令人疲惫的方式时,我会遇到一些错误。请帮助改进此代码:
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>发布于 2013-10-17 00:15:36
您可能不需要为文件中的每个标记声明一个变量,而是尝试迭代所有这些变量,提取每个标记的名称和值,并在运行时从这些变量中组合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结构动态构建命令,并将其参数填充到那里的数据中。但是,这样做依赖于这样一个事实,即表结构将与文件中的结构完全相同,并且在结构更改时仍然需要手动模式更新,但只要它们保持同步,就应该可以。
编辑
关于数据类型,我可以想到两种选择。保持原样,以字符串的形式发送任何内容,并依赖DB引擎来解析、验证这些数据并将其转换为数字(这取决于您正在使用的DB,这可能是可能的,但我想这并不少见)。或者修改代码,将除循环之外的特殊字段分离开来(不包括在循环之外),然后逐个添加这些字段,并相应指定它们的类型。如果数字列是固定的,就像ID一样,其他的都是文本,那么这很容易做到。
https://stackoverflow.com/questions/19415823
复制相似问题