SqlBulkCopy - 将XML数据导入SQL表

时间:2011-10-27 17:09:50

标签: .net xml dataset xmldocument sqlbulkcopy

我有使用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而不能导入名称,因为其属性和DataSet只包含一列。有没有办法将属性映射到列?

使用XmlDocument代替DataSet可能更好吗?

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

1 个答案:

答案 0 :(得分:3)

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

也就是说,我更喜欢拨打WriteToServer overload实施IDataReader

您可以轻松创建一个扩展方法,该方法采用IEnumerable<T>实现并将其映射到IDataReader;基本上,您通过名称和索引将类的属性映射到表中的字段,其中索引也是您为T创建的Expression实例(编译为lambdas)数组的索引它接受T的实例并返回属性值。

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

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