0

在 C# 中,我有一个巨大的数据集,我想用 write 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);
            //    }
            //}
        }

但是程序执行后(长时间执行),文件无法打开。肿瘤坏死因子。

4

2 回答 2

4

在大量数据(批量操作)中,不建议使用 C#、ORM 和 ADO,以解决性能、内存、IO、往返和其他问题。
我更喜欢使用 RDBMS 核心功能来制作文件。

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

首先
获取表格行数。(调用 data Reader 和 else 被忽略)

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 上的分页查询示例可以在这里找到。

于 2013-05-08T05:40:14.803 回答
1

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

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

如果这没有帮助:

  • 是否抛出任何异常?
  • 是否创建了 XML 文件?
  • 如果有,有多大?
  • 您尝试用什么打开它?
  • 当你试图打开它时发生了什么?
  • 文件最后是否有结束标签?
于 2013-05-08T05:00:57.117 回答