【问题标题】:SqlBulkCopy - Importing XML data into SQL tableSqlBulkCopy - 将 XML 数据导入 SQL 表
【发布时间】:2011-12-16 17:00:06
【问题描述】:

我在使用 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 更好?

我认为我有什么问题。当我在汽车元素周围有一些根元素并且数据集表中缺少列时,数据集完全不同。它在没有根元素的情况下运行良好。

【问题讨论】:

  • 我已尝试导入您的代码,并且 DateSet 有 2 列(Id 和 Name),所以这不是问题。您的映射可能有问题吗?
  • 感谢您的评论。我会检查我的映射

标签: .net xml dataset xmldocument sqlbulkcopy


【解决方案1】:

我一般不喜欢使用DataSet 将 XML 数据导入我的数据库; DataSet 类有一种非常特殊的方式,可以将其数据构造为 XML,反之,也可以读取其他 XML。

也就是说,我更喜欢调用采用 IDataReader 实现的 WriteToServer overload

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

您通常会将 IDataReader.Read 实现映射到 IEnumerable&lt;T&gt;.MoveNext 方法。

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

【讨论】:

  • 感谢您的回答。我在你的回答后做了一些研究,发现了一些例子。
猜你喜欢
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2021-10-26
  • 2010-10-17
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多