c#导出大型数据库到XML

本文关键字:XML 数据库 大型 | 更新日期: 2023-09-27 18:12:26

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

c#导出大型数据库到XML

From MSDN:

如果不需要使用数据的内存关系视图对于DataSet, ExecuteXmlReader方法非常适合检索XML数据,特别是对于大量数据。因为ExecuteXmlReader是一个流API,它不需要检索和在将所有数据公开给调用者之前缓存所有数据如果使用数据集将关系数据转换为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();
      }
}

假设你必须在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();
    }
}
这是一个相当痛苦的脖子,但它工作得很好,内存占用非常小。