我目前有一个从 Web 服务生成报告的应用程序。报告基本上是由 Web 服务(使用存储过程)从数据库中提取的数据表。
前 50 条记录显示在屏幕上(发送到视图),但还有一个用户可以单击的按钮将整个查询下载到 Excel 电子表格。这是通过将查询结果传递到模型中,然后将其写入用于创建电子表格的字符串构建器来实现的。该动作方法的代码如下:
// WebService call
var reportResult = SubscriberService.GetReport(reportName, criteria.CurrentPageNumber - 1, 0, getReportParameters(model.GroupId, criteria));
model.Result = getModel(reportResult);
// if file name is not ended with .csv we there it as prefix and file will be prefix_{date}.csv
if (String.IsNullOrEmpty(fileName) || fileName.LastIndexOf(".csc", StringComparison.InvariantCultureIgnoreCase) != fileName.Length - 4)
fileName = string.Format("{0}_{1}.csv", fileName, DateTime.Now.ToShortDateString());
HttpContext.Response.ContentType = "text/csv";
HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
if (model.Result != null)
{
StringBuilder sb = new StringBuilder();
exportRowHeader(sb);
HttpContext.Response.Write(sb.ToString());
sb.Clear();
foreach (var item in model.Result.Members)
{
exportRowData(sb, model.Result, item);
HttpContext.Response.Write(sb.ToString());
sb.Clear();
}
HttpContext.Response.Write(sb.ToString());
}
else
{
HttpContext.Response.Write(ReportResources.Report_Exporting_NoDataAvailable);
}
HttpContext.Response.Flush();
我的问题是,对于大型查询,与 Web 服务的通信需要很长时间并且超时。可以通过 WebService 发送的最大数据量也存在问题。
所以我想做的是分解 WebService 调用。WebService 能够对它发回的结果进行分页。所以我基本上一次调用 200 个结果(直到所有结果都返回)。
这是否可以通过简单地创建额外的 stringbuilder 对象然后将它们组合在一起来制作一个结果电子表格来实现?这会导致内存问题吗?
如果这似乎不可能,您可以建议替代解决方案吗?