SqlBulkCopy - Importando datos XML a la tabla SQL

.net dataset sqlbulkcopy xml xmldocument

Pregunta

Estoy teniendo problemas con la importación de un archivo XML utilizando SqlBulkCopy . El archivo XML se ve así:

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

Mi mesa se ve así:

Int         Id
varchar    Name

Aquí está mi código:

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();

Solo pude importar la Id pero no el nombre porque su atributo y el DataSet contiene solo una columna. ¿Hay alguna manera de asignar los atributos a las columnas?

Tal vez es mejor usar XmlDocument lugar de DataSet ?

Creo que lo que está mal. El conjunto de datos es bastante diferente cuando tengo algún elemento raíz alrededor del elemento Automobiles y las columnas faltan en las tablas de Dataset. Funciona bien sin elemento raíz.

Respuesta aceptada

Generalmente no me gusta usar un DataSet para importar datos XML a mi base de datos; La clase DataSet tiene una forma muy específica de estructurar sus datos como XML y, a la inversa, leer otros XML.

Dicho esto, prefiero llamar a la sobrecarga de WriteToServer que toma una implementación IDataReader .

Puede crear fácilmente un método de extensión que tome una IEnumerable<T> y la IDataReader a un IDataReader ; básicamente, asigna las propiedades de la clase a los campos de la tabla por nombre e índice donde el índice también es un índice en una matriz de instancias de Expression (compiladas a lambdas) que crea para T que toma la instancia de T y devuelve El valor de la propiedad.

Por lo general, IDataReader.Read implementación IEnumerable<T>.MoveNext al IEnumerable<T>.MoveNext .

Una vez que tenga algo como esto en su lugar, puede asignar su XML a un objeto de datos de luz que refleja la tabla y luego pasar la secuencia de ellos a un método de extensión que asigna la secuencia a una implementación de IDataReader .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué