2013-05-08 39 views
0

在C#中,我有我想要写与写XML XML文件一个巨大的数据集,这是我的代码:将巨大的sql数据集写入xml文件的最佳方法?

using (var myConnection = new SqlConnection("Data Source=192.168.5.28;Initial Catalog=dbName;User ID=sa;Password=davood$;")) 
     { 

      var da = new SqlDataAdapter("select * from tblName", myConnection); 
      var ds = new DataSet(); 
      da.Fill(ds); 
      var filestream = File.Create("D:\\tblName.xml"); 
      var buffered = new BufferedStream(filestream); 
      ds.WriteXml(buffered); 
      // ds.WriteXml("D:\\tblName.xml", System.Data.XmlWriteMode.IgnoreSchema); 

      // 
      //using (var fileStream = File.Create("D:\\tblName.xml")) 
      //{ 
      // using (var zipStream = new GZipStream(fileStream, CompressionMode.Compress)) 
      // { 
      //  ds.WriteXml(zipStream, XmlWriteMode.WriteSchema); 
      // } 
      //} 
     } 

但程序后执行(长时间运行),文件是可以不开放。 Tnx。

回答

4

对于性能,内存,IO,往返等问题,在大量数据大小(批量操作)下,不建议使用C#,ORM和ADO。
我宁愿使用RDBMS核心功能来创建文件。

顺便说一下,您可以使用Paging来划分查询结果,对于任何页面您可以创建一个单独的xml文件,在Windows操作系统上我们有4个文件大小限制,所以页面大小必须平衡,尺寸。

第一个
获取表行数。 (调用数据读取器和其他被忽略)

var dataRowsCount = select count(*) from tblName 


选择一个有效的页面大小,分一次调用此页面大小的结果,你将有你的循环计数,这样的事情:

var pageSize = 1000; 
var pageCount = (dataRowsCount/PageSize) + 1; 


在一个循环(基于第二阶段的结果),调用分页查询来获取数据,并创建多个XML文件。在MSSQLSERVER,甲骨文和MySQL

for(i=0;i<pageCount,i++) 
{ 
    // Call paged query and create files 
    // SQL Server paged Query 
    SELECT TOP pageSize columns 
    FROM Table  
    WHERE IDColumn NOT IN (SELECT TOP pageSize*i IDColumn  
    FROM Table  
    ORDER BY SortColumn)  
    ORDER BY SortColumn; 
} 

分页查询样本可以发现here

1

我的怀疑是,如果数据是“巨大的”,它可能会有内存故障加载到数据集,或写入磁盘,或者甚至在你试图打开生成的XML文件的任何应用程序。

我个人建议使用DataReader一次读入一条记录,然后每次输出一条XML记录。这样的文件大小应该是无关紧要的。这是更多的工作,但更好的做法。

如果不帮助:

  • 是否有任何异常抛出?
  • 是否创建了一个XML文件?
  • 如果是这样,有多大?
  • 你是怎么试着打开它的?
  • 当你试图打开它时发生了什么?
  • 文件末尾是否有结束标签?
相关问题