将巨大的sql数据集写入xml文件的最佳方法?

时间:2013-05-08 04:53:49

标签: c# xml dataset large-files

在C#中,我有一个庞大的数据集,我想用xml写入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。

2 个答案:

答案 0 :(得分:4)

在大量的数据大小(批量操作)中,不建议使用C#,ORM和ADO来实现性能,内存,IO,往返等问题。
我更喜欢使用RDBMS核心用于制作文件。

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

<强>第一
获取表行数。 (调用数据读取器,否则被忽略)

var dataRowsCount = select count(*) from tblName 

<强>第二
选择有效的页面大小,将第一次调用的结果除以此页面大小,您将获得循环计数,如下所示:

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

第三次
在循环中(基于第二阶段的结果),调用分页查询以获取数据并创建多个xml文件。

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;
}

在MSSqlServer,Oracle和MYSql上寻找查询示例here

答案 1 :(得分:1)

我怀疑如果数据是“巨大的”,它可能在将数据集加载到数据集中,或者将其写入磁盘时,或者甚至在您尝试打开生成的XML文件的任何应用程序中都存在内存问题。

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

如果这没有帮助:

  • 是否抛出任何例外?
  • 是否创建了XML文件?
  • 如果是这样,有多大?
  • 你试图打开它是什么?
  • 当你试图打开它时发生了什么?
  • 文件末尾是否有结束标记?
相关问题