在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。
答案 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记录。这样文件大小应该是无关紧要的。这是更多的工作,但更好的做法。
如果这没有帮助: