我正在嘗試將包含 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 列)寫入一個文本文件。當然,我的代碼不會從數據庫中讀取,但這仍然應該為您提供足夠好的基線。
- 1 回答
- 0 關注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消