C#将大型数据库导出为XML

时间:2014-07-09 22:57:56

标签: c# sql .net database export

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

2 个答案:

答案 0 :(得分:2)

来自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();
      }
}

答案 1 :(得分:1)

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

一般的想法是创建XmlWriter,然后通过调用SqlDataReader创建SqlCommand.ExecuteReader,然后一次读取一条记录。当您阅读每条记录时,将其输出到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();
    }
}

颈部相当疼痛,但效果很好,内存占用空间很小。