我有使用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元素周围有一些根元素并且数据集表中缺少列时,数据集是完全不同的。它没有根元素,效果很好。
答案 0 :(得分:3)
我通常不喜欢使用DataSet
将XML数据导入我的数据库; DataSet
类有一种非常具体的方式将其数据结构化为XML,反之,读取其他XML。
也就是说,我更喜欢拨打WriteToServer
overload实施IDataReader
。
您可以轻松创建一个扩展方法,该方法采用IEnumerable<T>
实现并将其映射到IDataReader
;基本上,您通过名称和索引将类的属性映射到表中的字段,其中索引也是您为T
创建的Expression
实例(编译为lambdas)数组的索引它接受T
的实例并返回属性值。
您通常会将IDataReader.Read
实施映射到IEnumerable<T>.MoveNext
方法。
一旦你有了这样的东西,你就可以将你的XML映射到一个反映表的轻量级数据对象,然后将它们的序列传递给一个扩展方法,该方法将序列映射到IDataReader
实现。