SqlBulkCopy - Importation de données XML dans une table SQL

.net dataset sqlbulkcopy xml xmldocument

Question

J'ai des problèmes avec l'importation d'un fichier XML avec SqlBulkCopy . Le fichier XML ressemble à ceci:

   <root>
    <Automobiles>
        <Car Id="1" Name="SomeModel1"/>
        <Car Id="2" Name="SomeModel2"/>
        <Car Id="3" Name="SomeModel2"/>
    </Automobiles>
   </root>

Ma table ressemble à ceci:

Int         Id
varchar    Name

Voici mon code:

DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("autolist.xml"));

SqlConnection connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["Connection"].ToString());
SqlBulkCopy sbc = new SqlBulkCopy(connection);
sbc.DestinationTableName = "Automobiles";

foreach (DataColumn dc in ds.Tables[0].Columns)
{
    sbc.ColumnMappings.Add(dc.Caption, dc.Caption);
}

connection.Open();

sbc.WriteToServer(ds.Tables[0]);

connection.Close();

Je ne pouvais importer que l' Id mais pas le nom, car son attribut et le DataSet ne contiennent qu'une seule colonne. Est-il possible de mapper les attributs aux colonnes?

Peut-être qu'il vaut mieux utiliser XmlDocument au lieu de DataSet ?

Je pense que ce qui ne va pas Le jeu de données est assez différent lorsque j'ai un élément racine autour de l'élément Automobiles et qu'il manque des colonnes dans les tables de jeux de données. Cela fonctionne bien sans élément racine.

Réponse acceptée

Généralement, je n'aime pas utiliser DataSet pour importer des données XML dans ma base de données; la classe DataSet a une manière très spécifique de structurer ses données en XML et inversement, de lire d’autres XML.

Cela dit, je préfère appeler la surcharge WriteToServer qui nécessite une implémentation IDataReader .

Vous pouvez facilement créer une méthode d'extension qui prend une implémentation IEnumerable<T> et la mappe à un IDataReader ; En gros, vous mappez les propriétés de la classe sur les champs de la table par nom et index, où l'index est également un index dans un tableau d'instances Expression (compilées en lambdas) que vous créez pour T qui prend l'instance de T et renvoie la valeur de la propriété.

En IDataReader.Read générale, vous IDataReader.Read implémentation IDataReader.Read la IDataReader.Read IEnumerable<T>.MoveNext .

Une fois que vous avez installé quelque chose comme cela, vous pouvez mapper votre XML sur un objet de données ultra-léger qui reflète la table, puis en passer la séquence à une méthode d'extension IDataReader la séquence à une implémentation IDataReader .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi