将XML数据导入SQL Server表

3

我有一个问题,需要将XML文件中的数据导入到SQL Server表中。

以下是我的XML文件示例:

<ORDER>
  <ORDER_HEADER>
    <NUMBER>109</NUMBER>
  </ORDER_HEADER>
  <CUSTOMER_HEADER>
    <CUSTOMER>Michael</CUSTOMER>    
  </CUSTOMER_HEADER>
  <ORDER_ITEMS>
    <ITEM>
      <CATALOG_NUMBER>2</CATALOG_NUMBER>
      <VAT>21</VAT>
    </ITEM>
    <ITEM>
      <CATALOG_NUMBER>5</CATALOG_NUMBER>
      <VAT>21</VAT>
    </ITEM>
    <ITEM>
      <CATALOG_NUMBER>7</CATALOG_NUMBER>
      <VAT>21</VAT>
    </ITEM>
    <ITEM>
      <CATALOG_NUMBER>9</CATALOG_NUMBER>
      <VAT>21</VAT>
    </ITEM>
  </ORDER_ITEMS>
</ORDER>

以下是我的 C# 代码:

XDocument doc = XDocument.Load("C:\\Users\\L\\order.xml");
var NUMBER = doc.Descendants("NUMBER");                
var CUSTOMER = doc.Descendants("CUSTOMER");
var CATALOG_NUMBER = doc.Descendants("CATALOG_NUMBER");
var VAT = doc.Descendants("VAT");

SqlConnection conn = new SqlConnection("*****");
   conn.Open();
      foreach (var cislo in NUMBER)
        {
          using (SqlCommand cmd = conn.CreateCommand())
            {
               cmd.CommandText="Insert INTO ORDER_HEADER(NUMBER) VALUES (@cislo);";
               cmd.Parameters.AddWithValue("@cislo",cislo.Value);
               cmd.ExecuteNonQuery();
               cmd.Clone();
             }
        }
      foreach (var zakaznik in CUSTOMER)
        {
           using (SqlCommand cmd = conn.CreateCommand())
             {
               cmd.CommandText="Insert INTO CUSTOMER_HEAD(CUSTOMER)VALUES(@zakaznik);";
               cmd.Parameters.AddWithValue("@zakaznik", zakaznik.Value);
               cmd.ExecuteNonQuery();
               cmd.Clone();
              }
        }
      foreach (var katalo_cislo in CATALOG_NUMBER)
        foreach (var vat1 in VAT)
           {
              using (SqlCommand cmd = conn.CreateCommand())
                 {
                    cmd.CommandText = "Insert INTO ITEM (CATALOG_NUMBER,VAT) VALUES (@katalo_cislo,@vat1);";
                    cmd.Parameters.AddWithValue("@katalo_cislo", katalo_cislo.Value);
                    cmd.Parameters.AddWithValue("@vat1", vat1.Value);
                    cmd.ExecuteNonQuery();
                    cmd.Clone();
                  }
           }
    conn.Close();

首先,前两个SQL表没有问题,但是在最后一个SQL表中,ITEM的记录超过了4条......问题可能出现在两个FOREACH循环中......但我该如何正确加载ORDER_ITEMS的记录呢?

谢谢。

以下是我目前的代码和所有值:

var Items = doc.Descendants("ITEM").Select(x => new { NUMBER = (int?)x.Element("NUMBER"), CATALOG_NUMBER = (string)x.Element("CATALOG_NUMBER"), ITEM_NAME = (string)x.Element("ITEM_NAME"), UNIT = (string)x.Element("UNIT"), AMOUNT = (int?)x.Element("AMOUNT"), PRICE_WITHOUT_VAT = (string)x.Element("PRICE_WITHOUT_VAT"), VAT = (string)x.Element("VAT"), PRICE_VAT = (string)x.Element("PRICE_VAT"), EAN = (string)x.Element("EAN"), SUPPLIER_ITEM_NUMBER = (string)x.Element("SUPPLIER_ITEM_NUMBER"), SUPPLIER_ID = (string)x.Element("SUPPLIER_ID"), SUPPLIER_NAME = (string)x.Element("SUPPLIER_NAME"), ORDER_ITEMS_Id = (string)x.Element("ORDER_ITEMS_Id"), }).ToList();
                foreach (var item in Items)
                                            {
                                                using (SqlCommand cmd = conn.CreateCommand())
                                                {
                                                    cmd.CommandText = "Insert INTO ITEM (NUMBER,CATALOG_NUMBER,ITEM_NAME,UNIT,AMOUNT,PRICE_WITHOUT_VAT,VAT,PRICE_VAT,EAN,SUPPLIER_ITEM_NUMBER,SUPPLIER_ID,SUPPLIER_NAME,ORDER_ITEMS_Id) VALUES (@cislo,@katalo_cislo,@nazev_zbozi,@jednotka,@mnozstvi,@cenabezvat,@vat1,@cenavat,@ean1,@dodav_cislo,@dodav_id,@dodav_jmeno,@objednavkaid);";
                                                    cmd.Parameters.AddWithValue("@cislo", item.NUMBER);
                                                    cmd.Parameters.AddWithValue("@katalo_cislo", item.CATALOG_NUMBER);
                                                    cmd.Parameters.AddWithValue("@nazev_zbozi", item.ITEM_NAME);
                                                    cmd.Parameters.AddWithValue("@jednotka", item.UNIT);
                                                    cmd.Parameters.AddWithValue("@mnozstvi", item.AMOUNT);
                                                    cmd.Parameters.AddWithValue("@cenabezvat", item.PRICE_WITHOUT_VAT);
                                                    cmd.Parameters.AddWithValue("@vat1", item.VAT);
                                                    cmd.Parameters.AddWithValue("@cenavat", item.PRICE_VAT);
                                                    cmd.Parameters.AddWithValue("@ean1", item.EAN);
                                                    cmd.Parameters.AddWithValue("@dodav_cislo", item.SUPPLIER_ITEM_NUMBER);
                                                    cmd.Parameters.AddWithValue("@dodav_id", item.SUPPLIER_ID);
                                                    cmd.Parameters.AddWithValue("@dodav_jmeno", item.SUPPLIER_NAME);
                                                    cmd.Parameters.AddWithValue("@objednavkaid", item.ORDER_ITEMS_Id);
                                                    cmd.ExecuteNonQuery();
                                                    //cmd.Clone();
                                                }
                                            }

您可以从XML创建数据集,“DataSet ds = new DataSet(); ds.ReadXml(XDocument.Load(fname).CreateReader());”,然后使用SqlDataAdapter将其直接插入到数据库中。 - I4V
1个回答

3
foreach (var katalo_cislo in CATALOG_NUMBER)
foreach (var vat1 in VAT){}

以上代码将向数据库插入(CATALOG_NUMBER的数量) * (VAT的数量)条记录,我认为你需要向Item表中插入项目。然后,您只需选择ITEM节点,并按以下方式将其插入到表中

var Items = doc.Descendants("ITEM")
        .Select(x=> new {CATALOG_NUMBER= (string)x.Element("CATALOG_NUMBER"), 
                        VAT = (int?)x.Element("VAT")} ).ToList();
foreach( var item in Items)
{
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "Insert INTO ITEM (CATALOG_NUMBER,VAT) VALUES (@katalo_cislo,@vat1);";
        cmd.Parameters.AddWithValue("@katalo_cislo", item.CATALOG_NUMBER);
        cmd.Parameters.AddWithValue("@vat1", (object)item.VAT??DBNull.Value);
        cmd.ExecuteNonQuery();
    }
}

现在我遇到了这个错误:元素的值不能为空... :/ - Kate
@Kate 在你的 XML 中,某个项目没有增值税(VAT)值。因此,上面的代码将为该项目插入空值。如果 VAT 为空,你到底想做什么? - Damith
我想仅取CATALOG_NUMBER和VAT的值并传递给SQL表,但是当我有更多的foreach时,就会有很多记录。而我希望当XML文件中有4个ITEMS时,在SQL表中有4个记录。对于我的糟糕英语,我感到很抱歉。 - Kate
@Kate,你还是遇到同样的错误吗?如果你遇到了错误,你可能需要在数据库表中允许VAT列为空。 - Damith
在第一篇帖子中,我只有我的代码示例..我有更多的值..我会更新我的第一篇帖子,并在我的情况下给你解决方案... - Kate
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接