2

非常奇怪的问题,因为这在我们旧的 Classic ASP 站点上运行良好。我们基本上是在查询数据库并通过 Response.Write 将大约 2200 行文本导出到文本文件以输出到对话框并允许用户保存文件。

Response.Clear() Response.ClearContent() Response.ClearHeaders()

    Dim fileName As String = "TECH" & test & ".txt"

    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName))
    Response.ContentType = "text/plain"

    Response.Write(strHeader)

    Dim sw As New IO.StringWriter()

    Dim dtRow As DataRow
    For Each dtRow In dt3.Rows
        sw.Write(dtRow.Item("RECORD") & vbCrLf)
    Next

    Response.Write(sw.ToString)
    Response.Write(strTrailer & intRecCount)
    Response.End()

我可以使用 StringWriter 或简单地使用 Response.Write(dt.Rows(i).Item("RECORD").toString

无论哪种方式,Export 都会在我们的开发站点上造成可怕的挂起。我的本地机器不会导致挂起,几乎是瞬时的。记录集不是很大,它正在写入的行很小。

任何人都知道为什么这会被挂起?它最终允许保存和显示文件,但它远远超过 3-4 分钟。

4

3 回答 3

2

附加一个远程调试器并找到它挂在哪里?

您需要确定它是字符串编写器循环,还是实际的查询代码(此处未提供)。

于 2008-11-13T17:38:07.987 回答
0

听起来你可能溢出了输出缓冲区。也许在那里添加一个计数器以每隔几百行刷新一次。

此外,Response 对象基本上为您完成了 StringWriter 的大部分工作。使用 StringWriter 作为中介可能是多余的。

于 2008-11-13T17:40:05.473 回答
0

使用 StringWriter 和 DataTable 都过大了。

为什么不直接使用SqlReader从数据库中获取结果,同时读取reader,直接写入输出流呢?速度更快,消耗的内存更少。

作为对第二个问题的回答——为什么 ASP 工作正常,我怀疑你是否在内存中存储了 3 次相同的内容以便输出它(在 DataTable、StringWriter 和输出缓冲区中)。我的 ASP 有点生疏,但我猜你正在使用某种数据库阅读器。

此外,最好使用一些日志记录基础设施(NLog、log4net),这样您就可以输出一些关于哪个操作延迟多少的时间,作为附加远程调试器的替代方法。

于 2008-11-13T18:05:26.280 回答