Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将大型数据库导出为XML_C#_Sql_.net_Database_Export - Fatal编程技术网

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

C#将大型数据库导出为XML,c#,sql,.net,database,export,C#,Sql,.net,Database,Export,将多个SQL数据库表导出到单个XML文件时,内存效率最高的方法是什么?我希望避免将表加载到内存中(例如:DataTable或DataSet)假设您必须在C#中执行此操作(即,您不能使用外部工具,我认为这是最好的解决方案),您可以使用它按顺序读取表并单独输出每个记录。缺点是它需要一些手工编写的XML代码 一般的想法是创建一个,然后通过调用SqlCommand.ExecuteReader创建一个SqlDataReader,然后一次读取一条记录。读取每条记录时,将其输出到XmlWriter: var

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

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

一般的想法是创建一个,然后通过调用
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();
    }
}

这是一个相当棘手的问题,但是它工作得很好,内存占用也很小。

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

一般的想法是创建一个,然后通过调用
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();
    }
}
这是一件令人头疼的事,但它工作得很好,内存占用也很小。

来自MSDN:

如果不需要使用内存中的数据关系视图 对于数据集,ExecuteXmlReader方法非常适合检索 XML数据,特别是对于大量数据。因为 ExecuteXmlReader是一个流式API,它不需要检索和 缓存所有数据,然后将其公开给调用方,就像 如果使用数据集将关系数据转换为XML,则为这种情况

对于您的示例,可以是这样的(使用ExecuteXmlReader):

从MSDN:

如果不需要使用内存中的数据关系视图 对于数据集,ExecuteXmlReader方法非常适合检索 XML数据,特别是对于大量数据。因为 ExecuteXmlReader是一个流式API,它不需要检索和 缓存所有数据,然后将其公开给调用方,就像 如果使用数据集将关系数据转换为XML,则为这种情况

对于您的示例,可以是这样的(使用ExecuteXmlReader):


你没有很多选择。您几乎只剩下一个SQLDataReader。链接的“副本”不是副本。这个问题的公认答案会将整个表加载到内存中,这正是这里的OP不想要的。您没有很多选择。您几乎只剩下一个SQLDataReader。链接的“副本”不是副本。这个问题的公认答案将整个表加载到内存中,这正是这里的OP不想要的。有趣。查询中的
FOR XML
子句会自动将结果格式化为XML?是的,但具有简单的层次结构,有关更多信息,请参阅此msdn链接-很高兴知道。下次我必须这样做时,我会给
ExecuteXmlReader
try.lol:)…应该有一个名为executeToAnything(字符串格式)的方法,比如xml、json等…很有趣。查询中的
FOR XML
子句会自动将结果格式化为XML?是的,但具有简单的层次结构,有关更多信息,请参阅此msdn链接-很高兴知道。下次我必须这样做时,我将给
ExecuteXmlReader
try.lol:)…应该有一个名为executeToAnything(字符串格式)的方法,比如xml、json等。。。