【问题标题】:How to use IDataReader with XmlReader for SqlCeBulkCopy?如何将 IDataReader 与 XmlReader 一起用于 SqlCeBulkCopy?
【发布时间】:2015-04-10 11:34:22
【问题描述】:

我有很大的 XML 文件 (2 Gb),我需要将数据导入到 sql ce db。 XML 文件有一个根标签和许多具有 20 个属性的相同标签(如 2d 表):

<Objects>
<Object ID="" name="" level="" />
<Object ID="" name="" level="" /> 

为了将数据从 XML 加载到 sql ce db,我使用 SqlCeBulkCopy(在 codeplex 上)。我尝试使用DataTable,但出现此错误(因为 XML 大于 2 Gb):

“System.OutOfMemoryException”

我使用XmlReader从XML文件中读取信息:

XmlReader r = XmlReader.Create("file:////" + PathToFile);
  while (r.Read())
    {
        if ((r.Name == "Object") && (r.HasAttributes))
        {

        }
    }

在这种情况下(任何示例)如何将IDataReaderXmlReader 一起用于SqlCeBulkCopy

【问题讨论】:

    标签: c# xml sql-server-ce idatareader


    【解决方案1】:

    xmlReader 和 DbDataReader 不相关。但是 SqlCeBulkcopy 同时支持 List 和 DataTable 对象以及 DbDataReader

    使用列表,只加载 10000 行/记录,然后批量复制这些并继续。您无法将 2 GB 的 XML 文件放入内存!

    所以在你的while循环之外添加(伪代码):

    var list = new List<MyObjects>();
    

    在你的 while 循环中添加:

    var myObject = new MyObject();
    myObject.Property1 = value from xmlreader;
    myObject.Property2 = anotherValue from xmlreader;
    
    list.Add(myObject);
    
    if (list.Count == 10000)
    {
       //run BulkCopy
       list.Clear();
    } 
    

    【讨论】:

    • 我关于IDataREader 例如public class CustomObjectDataReader : IDataReader 并在此使用XmlReader
    • 为什么要让自己这么难?
    • @ErikEJ,您好。现在是 2019 年。你还认为你的实现比实现IDataReader 更好吗?我只是面临同样的问题,无法决定哪个更好 - 实施IDataReader 或遵循您的答案。
    • 你认为我对你的问题的回答是什么?
    • @ErikEJ,我认为您在上面发布的答案仍然相关。所以,我在当前的实现中使用了它。是不是这里的情况,你的回答还有意义吗? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多