为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 C# Web 应用程序中将 SQL Server 表中超过 100 万行导出到 CSV?

如何在 C# Web 应用程序中将 SQL Server 表中超过 100 万行导出到 CSV?

C#
动漫人物 2023-07-22 16:42:15
我正在尝试将包含 100 万行和 45 列的 SQL Server 表导出到一个.csv文件,供用户通过 Web 界面下载,但需要很长时间,最终我不得不手动停止该过程。我使用 aSqlDataReader并在读者读取时写入文件以避免内存问题。该代码适用于小表(少于 3k 行),但大表继续运行,并且目标文件保持在 0 KB。using (spContentConn) { using (var sdr = sqlcmd.ExecuteReader())    using (CsvfileWriter)    {         DataTable Tablecolumns = new DataTable();        for (int i = 0; i < sdr.FieldCount; i++)        {            Tablecolumns.Columns.Add(sdr.GetName(i));        }        CsvfileWriter.WriteLine(string.Join("~", Tablecolumns.Columns.Cast<DataColumn>().Select(csvfile => csvfile.ColumnName)));        while (sdr.Read())            for (int j = Tablecolumns.Columns.Count; j > 0; j--)            {                if (j == 1)                    CsvfileWriter.WriteLine("");                else                    CsvfileWriter.Write(sdr[Tablecolumns.Columns.Count - j].ToString() + "~");            }    }我使用了该线程中推荐的相同答案,但仍然不起作用。请帮忙。 
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

从.NET文档中并不清楚是否具有有效的缓冲,因此当我需要读/写大量数据时FileWriter我总是使用a代替。BufferedStream使用流,您必须编写字节数据而不是字符串,但这只需要对代码进行少量调整。

看起来您正在DataTable循环中读取和写入 a 的列,这会影响性能。由于在导出操作期间列的数量和顺序不会改变,因此请考虑使用位置索引来访问列值。一次写入一行而不是一次写入一列会更好。

最后,您正在使用数据读取器,因此它应该提供来自 SQL Server 的最佳数据吞吐量(显然,受到服务器和带宽的限制)。这也表明性能瓶颈在于将数据写入文件的方式。

作为比较,我在 60 秒内将 1,000,000 行(每行 45 列)写入一个文本文件。当然,我的代码不会从数据库中读取,但这仍然应该为您提供足够好的基线。


查看完整回答
反对 回复 2023-07-22
  • 1 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信