将多个SQL数据库表导出到单个XML文件的内存效率最高的方法是什么?我想避免将表加载到内存中(例如:DataTable或DataSet)
答案 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();
}
}
颈部相当疼痛,但效果很好,内存占用空间很小。