尝试生成某些HTML报告时,出现'System.OutOfMemoryException'。重构 - System.OutOfMemoryException
我该如何重新设定这个值,以便将其缓冲到文件中,而不是将其全部读取到内存中,然后写入文件。
数据表中会有超过2000多条记录向上,并且已经有2000行的内存不足。
DetailsUpdateTemplate包含一个多行html代码片段。我假设我正在创建一个很大的字符串。串联次数超出屈指可数的字符串时
我使用C#,.NET 3.5
internal static String SaveARSUpdateHTML(DataTable table, string fileName)
{
int recordCount = table.Rows.Count;
Dictionary<String, object> templateCols = new Dictionary<string, object>();
templateCols["Track"] = table.TableName;
templateCols["ProdDate"] = DateTime.Now.ToShortDateString();
templateCols["ProdTime"] = DateTime.Now.ToShortTimeString();
templateCols["TotalRecords"] = recordCount;
String detailOutput = String.Empty;
for (int i = 0; i < table.Rows.Count; i++)
{
int ResultID = i + 1;
DataRow row = table.Rows[i];
String ReportDetails = DetailsUpdateTemplate;
ReportDetails = ReportDetails.Replace(String.Format("{{{0}}}", "ResultID"), ResultID.ToString());
foreach (DataColumn column in table.Columns)
{
String value = row[column.ColumnName].ToString();
if (column.ColumnName.Equals("TF"))
{
String display = value.Equals("no", StringComparison.CurrentCultureIgnoreCase) ? "none" : "block";
ReportDetails = ReportDetails.Replace(String.Format("{{{0}}}", "SuppressNewAddr"), display);
}
ReportDetails = ReportDetails.Replace(String.Format("{{{0}}}", column.ColumnName), value);
}
detailOutput += ReportDetails;
}
templateCols["ReportDetails"] = detailOutput;
String masterOut = MasterUpdateTemplate;
foreach (KeyValuePair<string, object> pair in templateCols)
{
masterOut = masterOut.Replace(String.Format("{{{0}}}", pair.Key), pair.Value.ToString());
}
String outputFile = String.Format("{0}.htm", fileName);
using (StreamWriter sw = new StreamWriter(outputFile))
{
sw.Write(masterOut);
}
return outputFile;
}
您没有提供代码的相关部分。所有这些代码正在做的是修改内存中已经有**的一些数据以将其保存到文件中。 'DataTable'是内存中的。所以,而不是使用'DataTable'使用SqlDataReader并直接流到文件。 – 2010-06-22 21:21:27
我正在从一个不同的库中传递一个DataTable。我无法改变输入行为。 – 2010-06-22 21:28:00