Ответ. Записать данные DataTable в текстовый файл, ASP.net зависает - PullRequest
2 голосов
/ 13 ноября 2008

Очень странная проблема, так как она отлично работает на нашем старом классическом ASP-сайте. В основном мы запрашиваем базу данных и экспортируем около 2200 строк текста в текстовый файл с помощью Response.Write для вывода в диалоговое окно и позволяют пользователю сохранить файл.

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

В любом случае, экспорт вызывает ужасные зависания на нашем сайте разработки. Моя локальная машина не вызывает зависаний и работает практически мгновенно. Набор записей не очень большой, и строки, которые он пишет, маленькие.

У кого-нибудь есть идеи, почему это будет зависать? Это позволяет в любой момент сохранить и отобразить файл, но это занимает более 3-4 минут.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2008

Присоединить удаленный отладчик и найти где его висит?

Вам необходимо выяснить, является ли это цикл записи строк или реальный код запроса (который здесь не указан).

0 голосов
/ 13 ноября 2008

Оба с использованием StringWriter и DataTable излишни.

Почему бы не использовать SqlReader напрямую для получения результатов из базы данных, а во время чтения ридера записывать напрямую в выходной поток? Гораздо быстрее и потребляет намного меньше памяти.

В качестве ответа на ваш второй вопрос - почему ASP работал нормально, я сомневаюсь, что там вы сохранили один и тот же контент 3 раза в памяти для его вывода (в DataTable, в StringWriter и в выходной буфер ). Мой ASP немного заржавел, но я предполагаю, что там вы используете какой-то читатель базы данных.

Кроме того, лучше использовать некоторую инфраструктуру ведения журналов (NLog, log4net), чтобы вы могли выводить некоторую информацию о том, на сколько задерживается операция, в качестве альтернативы подключению удаленного отладчика.

0 голосов
/ 13 ноября 2008

Звучит так, как будто вы переполняете буфер вывода. Возможно, добавьте туда счетчик, чтобы очищать каждые несколько сотен строк.

Кроме того, объект Response в основном выполняет большую часть работы за StringWriter. Использование StringWriter в качестве посредника, вероятно, излишне.

...