SqlBulkCopy - 将XML数据导入SQL表

.net dataset sqlbulkcopy xml xmldocument

我有使用SqlBulkCopy导入XML文件的问题。 XML文件如下所示:

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

我的表看起来像这样:

Int         Id
varchar    Name

这是我的代码:

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

我只能导入Id但不能导入Name,因为它的属性和DataSet只包含一列。有没有办法将属性映射到列?

也许最好使用XmlDocument而不是DataSet

我想我错了。当我在Automobiles元素周围有一些根元素并且数据集表中缺少列时,数据集是完全不同的。它没有根元素,效果很好。

一般承认的答案

我通常不喜欢使用DataSet将XML数据导入我的数据库; DataSet类有一种非常具体的方法,可以将数据结构化为XML,反之,读取其他XML。

也就是说,我更喜欢调用带有IDataReader实现的WriteToServer重载

您可以轻松创建一个扩展方法,该方法采用IEnumerable<T>实现并将其映射到IDataReader ;基本上,你在那里索引也是一个索引的阵列映射类通过名称和索引在表中的字段的属性Expression您为创建实例(编译lambda表达式) T这需要的实例T并返回财产价值。

您通常将IDataReader.Read实现映射到IEnumerable<T>.MoveNext方法。

一旦你有这样的东西,你可以将你的XML映射到一个反映表的lightwieght数据对象,然后将它们的序列传递给一个扩展方法,该方法将序列映射到IDataReader实现。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因