2013-09-05 6 views
3

У меня проблема с импортом данных из xml в таблицы SQL Server.Импорт данных из таблиц 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(); 

Но первые 2 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(); 
               } 
              } 
+0

Вы можете создать набор данных из вашего XML 'DataSet DS = новый DataSet(); ds.ReadXml (XDocument.Load (fname) .CreateReader()); ", а затем вставить его непосредственно в DB с помощью SqlDataAdapter. – I4V

ответ

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

выше код будет вставлять (no of CATALOG_NUMBER)* (no of VAT) записи в базу данных, я думаю, вам нужно вставить товары в пункт Таблица. Тогда вы можете просто выбрать 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(); 
    } 
} 
+0

Теперь у меня есть эта ошибка: значение элемента не может быть NULL ...:/ – Kate

+0

@Kate в вашем xml для одного элемента нет значения НДС. Таким образом, выше код будет вставлять для него нулевое значение, что именно вы хотите сделать, если vat имеет значение NULL? – Damith

+0

У меня плохой первый пост ... для каждого ITEM есть номер каталога и vat ... – Kate

Смежные вопросы