【问题标题】:C# export of large datatbase to XMLC# 将大型数据库导出为 XML
【发布时间】:2014-07-09 22:57:56
【问题描述】:

将多个 SQL 数据库表导出到单个 XML 文件的最节省内存的方法是什么?我想避免将表加载到内存中(例如:DataTable 或 DataSet)

【问题讨论】:

  • 您没有太多选择。您几乎只剩下一个 SQLDataReader。
  • 链接的“重复”不是重复的。该问题的公认答案将整个表加载到内存中,这正是这里的 OP 不想要的。

标签: c# sql .net database export


【解决方案1】:

来自 MSDN:

如果不需要使用内存中的数据关系视图 在 DataSet 中,ExecuteXmlReader 方法非常适合检索 XML 数据,尤其是对于大量数据。因为 ExecuteXmlReader 是一个流式 API,它不必检索和 在将所有数据暴露给调用者之前缓存所有数据,就像 使用 DataSet 将关系数据转换为 XML 的情况。

你的例子可能是这样的(使用 ExecuteXmlReader):

XmlWriterSettings set = new XmlWriterSettings();
set.ConformanceLevel = ConformanceLevel.Document;
set.Indent = true;
//comm is your command object
using (XmlReader reader = comm.ExecuteXmlReader())
using (XmlWriter writer = XmlWriter.Create(File.Open("testing.xml",FileMode.OpenOrCreate,FileAccess.Write),set)) 
{
      while (!reader.EOF)
      {
          writer.WriteStartElement("test");
          writer.WriteNode(reader, true);
          writer.WriteEndElement();
      }
}

【讨论】:

  • 有趣。查询中的FOR XML 子句自动将结果格式化为 XML?
  • 是的,它确实 jim,但层次结构简单,更多信息请参考这个 msdn 链接 - msdn.microsoft.com/en-us/library/ms188273.aspx
  • 很高兴知道。下次我必须这样做时,我会尝试ExecuteXmlReader
  • lol :) ...应该有一个名为 executeToAnything(字符串格式)的方法,例如 xml、json 等...
【解决方案2】:

假设您必须在 C# 中执行此操作(即您不能使用外部工具,我认为这是最好的解决方案),您可以使用 SqlDataReader 顺序读取表格并单独输出每条记录。缺点是需要一些手写的 XML 代码。

一般的想法是创建一个XmlWriter,然后通过调用SqlCommand.ExecuteReader 创建一个SqlDataReader,然后一次读取一条记录。在阅读每条记录时,将其输出到XmlWriter

var settings = new XmlWriterSettings{ ... initialization here };
using (var writer = XmlWriter.Create(outputFilename, settings)
{
    SqlCommand cmd = new SqlCommand(queryString, connection);
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        writer.WriteStartElement("record");
        writer.WriteElementString("field1", record[0].ToString());
        writer.WriteElementString("field2", record[1].ToString());
        writer.WriteEndElement();
    }
}

这有点让人头疼,但效果很好,内存占用也很小。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2011-01-27
    • 2016-04-08
    相关资源
    最近更新 更多