Importer des données à partir de XML dans des tables SQL Server
J'ai un problème avec l'importation de données à partir de xml dans des tables SQL Server.
Cet exemple de mon fichier 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>
Et c'est mon code 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();
Mais d'abord, 2 tables sql est OK, mais dans la dernière table sql ARTICLE est plus de 4...le problème est probablement dans deux FOREACH... mais comment pourrais-je charger des enregistrements à partir de ORDER_ITEMS
droit?
Grâce
C'est mon code maintenant, avec tous mes valeurs:
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();
}
}
Vous pouvez créer un jeu de données à partir de votre xml
DataSet ds = new DataSet(); ds.ReadXml(XDocument.Load(fname).CreateReader());
puis de les insérer directement dans la base de données à l'aide de SqlDataAdapter.
OriginalL'auteur Kate | 2013-09-05
Vous devez vous connecter pour publier un commentaire.
code ci-dessus va insérer
(no of CATALOG_NUMBER)* (no of VAT)
enregistrements de la base de données, je pense que vous devez insérer des Éléments dans le Tableau des éléments. Ensuite, vous pouvez simplement sélectionner leITEM
les nœuds et les insérer dans le tableau ci-dessousdans votre xml pour un élément, il n'y a pas de TVA valeur. Donc le code ci-dessus va insérer la valeur null pour que, exactement ce que vous voulez faire si la tva est nulle?
j'ai un mauvais premier post...pour chaque ÉLÉMENT ont le numéro de catalogue et la tva...
désolé, veuillez expliquer votre exigence
je veux seulement prendre des valeurs od CATALOG_NUMBEr et de la TVA et de donner à la table sql...mais quand j'ai plus de foreach j'ai un let de dossiers...Et je veux que lorsque j'ai 4 ARTICLES dans le fichier XML 4 enregistrement dans la table SQL...désolé pour mon mauvais anglais..
OriginalL'auteur Damith