首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML到数据库,反之亦然。

XML到数据库,反之亦然。
EN

Stack Overflow用户
提问于 2013-10-16 23:38:33
回答 1查看 165关注 0票数 1

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

代码语言:javascript
复制
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文件看起来是这样的:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-17 00:15:36

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

代码语言:javascript
复制
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一样,其他的都是文本,那么这很容易做到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19415823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档