Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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# 在c中生成包含百万条记录的xml文件的最快方法_C#_Xml_Oracle_Odp.net - Fatal编程技术网

C# 在c中生成包含百万条记录的xml文件的最快方法

C# 在c中生成包含百万条记录的xml文件的最快方法,c#,xml,oracle,odp.net,C#,Xml,Oracle,Odp.net,我已经在VS2008中创建了一个Windows应用程序,我的要求是从一个获取一百万条记录的表生成一个xml文件。有没有关于最佳和最快方法的建议 对于同样的问题,最好的方法是什么 选项1:在Oracle中创建clob并在代码中获取它。 Oracle SP: C代码: 选项2:首先获取记录并使用xml编写器在c中构建xml 选项3:批量获取记录并构建xml 我的桌子T1 合伙人没有名字 00001阿尔奇 00034威廉姆斯 00046马克 00052贝蒂 以下是我的XML的外观: 请给我举个例子,

我已经在VS2008中创建了一个Windows应用程序,我的要求是从一个获取一百万条记录的表生成一个xml文件。有没有关于最佳和最快方法的建议

对于同样的问题,最好的方法是什么

选项1:在Oracle中创建clob并在代码中获取它。 Oracle SP:

C代码:

选项2:首先获取记录并使用xml编写器在c中构建xml 选项3:批量获取记录并构建xml 我的桌子T1

合伙人没有名字 00001阿尔奇 00034威廉姆斯 00046马克 00052贝蒂

以下是我的XML的外观:

请给我举个例子,说明最好的方法。我试图用类似的方法寻找例子。找不到。选项1需要相当长的时间才能获取记录

编辑

尝试选项2后,我得到“ContextSwitchDeadlock”异常。 我还尝试将IDataReader更改为OracleDataReader以增加fetchsize,但没有任何帮助。请给我指点。下面是我的代码:

cmd.CommandText = "SELECT PARTNER_NO FROM T1 WHERE YEAR LIKE '%2011-2012%'";  
XmlWriter myWriter = XmlWriter.Create("C:/Test/BookInfo.xml")  
myWriter.WriteStartDocument(true); 
using(OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))  
  {  
    reader.FetchSize = reader.RowSize * 5000;  
    myWriter.WriteStartElement("master_table");
    while(reader.Read())
      {  
         myWriter.WriteStartElement("partner");  
         myWriter.WriteElementString("partner_no", reader[0].ToString());  
         myWriter.WriteElementString("id","0008");  
         myWriter.WriteEndElement();  
      }  
 }  

 myWriter.WriteEndDocument();  
 myWriter.Flush();  
 myWriter.Close();  
 cmd.Dispose()  

您可以尝试最直观的方法,在IDataReader上迭代,然后边写边写

我不知道这是否是最快的方法,但它应该是最有效的内存,并且您不需要创建任何类型的批:

using (IDataReader reader = simpleSelectCommand.ExecuteReader())
{
    while (reader.Read())
    {
        myWriter.WriteStartElement("PARTNER");
        // write subnodes for this record
        myWriter.WriteEndElement();
    }
}

这不需要你花很多时间去做,而且可能对你来说已经足够快了

XML总是会消耗大量的空间,因此从服务器传输到客户端需要花费大量的时间。因此,我假设最快的方法是通过简单的select或as Ref游标从函数中选择数据,并在客户机中构建XML结构。这将是您的选项2。

我将专家,专家从oracle获取数据,使用oracle工具将数据转换为XML文件,如果oracle expect仍然只能执行CSV,则使用工具将CSV转换为XML。仅供参考,您的连接、命令和数据适配器都应使用块,以确保它们已被释放,即使发生了异常。谢谢约翰,我从没想过。将在我的代码中实现这一点。当我获取100000条记录时,这一点非常有效。但当我尝试获取所有记录时,我得到了ContextSwitchDeadlock异常。我必须做什么?看,这可能只是因为这个过程花费了很多时间。谢谢。由于VPN上的连接,这是一个问题。在网络上工作正常。在visual studio中,按ctrl+alt+e,它将显示异常设置,找到显示“托管调试设置”的设置,然后取消选中ContextSwitchDeadlock。这是为了让你知道有些事情可能是错的,但对你来说,这只是一个需要很长时间的过程。
cmd.CommandText = "SELECT PARTNER_NO FROM T1 WHERE YEAR LIKE '%2011-2012%'";  
XmlWriter myWriter = XmlWriter.Create("C:/Test/BookInfo.xml")  
myWriter.WriteStartDocument(true); 
using(OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))  
  {  
    reader.FetchSize = reader.RowSize * 5000;  
    myWriter.WriteStartElement("master_table");
    while(reader.Read())
      {  
         myWriter.WriteStartElement("partner");  
         myWriter.WriteElementString("partner_no", reader[0].ToString());  
         myWriter.WriteElementString("id","0008");  
         myWriter.WriteEndElement();  
      }  
 }  

 myWriter.WriteEndDocument();  
 myWriter.Flush();  
 myWriter.Close();  
 cmd.Dispose()  
using (IDataReader reader = simpleSelectCommand.ExecuteReader())
{
    while (reader.Read())
    {
        myWriter.WriteStartElement("PARTNER");
        // write subnodes for this record
        myWriter.WriteEndElement();
    }
}