Ошибка переполнения буфера в ASP Classic - PullRequest
0 голосов
/ 21 декабря 2011

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

То, что я пытаюсь сделать, это отобразить любую запись с текущей даты до двух недель. Пользователи могут ввести любую дату в течение этого двухнедельного периода, и таблица будет заполнять пробелы между или после по умолчанию «ЗЕЛЕНЫЙ» промежуток. Я работал до сегодняшнего дня. Я не трогал его три недели и понятия не имею, что случилось. Я скромный графический дизайнер, начальники которого не знают разницы между приложениями на основе html / css и asp / sql. Пожалуйста, помогите, прежде чем я сойду с ума ...

        <div class="cond_holder">
        <div class="dir_name">PEDS CARDIOLOGY</div>
<%
        Dim this_day_peds_cardio
        this_day_peds_cardio = Date

        Dim Conditions_peds_cardio
        Dim Conditions_peds_cardio_cmd
        Dim Conditions_peds_cardio_numRows

        Set Conditions_peds_cardio_cmd = Server.CreateObject ("ADODB.Command")
        Conditions_peds_cardio_cmd.ActiveConnection = MM_webdbs_STRING
        Conditions_peds_cardio_cmd.CommandText = "SELECT * FROM dbo.ryg_conditions WHERE aoc='1' AND Day >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0) ORDER BY aoc ASC, Day ASC" 
        Conditions_peds_cardio_cmd.Prepared = true

        Set Conditions_peds_cardio = Conditions_peds_cardio_cmd.Execute
        Conditions_peds_cardio_numRows = 0

        Dim Repeat_peds_cardio__numRows
        Dim Repeat_peds_cardio__index

        Repeat_peds_cardio__numRows = 14
        Repeat_peds_cardio__index = 0
        Conditions_peds_cardio_numRows = Conditions_peds_cardio_numRows + Repeat_peds_cardio__numRows

        While ((Repeat_peds_cardio__numRows <> 0) AND (NOT Conditions_peds_cardio.EOF)) 
            If DateDiff("d", (Conditions_peds_cardio.Fields.Item("Day").Value), this_day_peds_cardio)=0  Then
%>
                <span class="daily_condition <%=(Conditions_peds_cardio.Fields.Item("ryg").Value)%>">
                    <span style="display: none;"><%=(Conditions_peds_cardio.Fields.Item("aoc").Value)%></span>
                    <%=(Conditions_peds_cardio.Fields.Item("ryg").Value)%>
                    <span class="reason"><%=(Conditions_peds_cardio.Fields.Item("reasoning").Value)%></span>
                </span><!-- /.daily_condtion -->
<%
                this_day_peds_cardio = DateAdd("d", 1, this_day_peds_cardio)
            Else 
                While DateDiff("d", (Conditions_peds_cardio.Fields.Item("Day").Value), this_day_peds_cardio)<>0
%>  
                    <span class="daily_condition GREEN">GREEN</span><!-- SPACER -->
<%
                    this_day_peds_cardio = DateAdd("d", 1, this_day_peds_cardio)
                Wend
%>
                <span class="daily_condition <%=(Conditions_peds_cardio.Fields.Item("ryg").Value)%>">
                    <span style="display: none;"><%=(Conditions_peds_cardio.Fields.Item("aoc").Value)%></span>
                    <%=(Conditions_peds_cardio.Fields.Item("ryg").Value)%>
                    <span class="reason"><%=(Conditions_peds_cardio.Fields.Item("reasoning").Value)%></span>
                </span><!-- /.daily_condtion -->

<%
                this_day_peds_cardio = DateAdd("d", 1, this_day_peds_cardio)
            End if

            Repeat_peds_cardio__index=Repeat_peds_cardio__index+1
            Repeat_peds_cardio__numRows=Repeat_peds_cardio__numRows-1
            Conditions_peds_cardio.MoveNext()
        Wend

        While loop_ctr_peds_cardio < 14
%>
            <span class="daily_condition GREEN">GREEN</span><!-- FILLER -->
<%
            loop_ctr_peds_cardio = loop_ctr_peds_cardio +1
        Wend
%>
    </div><!-- /#cond_holder -->

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

Причина, по которой ваш буфер ответов переполнен, заключается в том, что у вас есть больше данных для показа. Самый быстрый способ его отсортировать должен заключаться в выдаче Response.Flush через каждые пару строк или около того (в зависимости от размера буфера ответов) внутри цикла while. Отключение буфера ответов почти всегда приводит к тому, что визуализация страницы занимает больше времени, особенно если у вас много переключений контекста, как у вас.

0 голосов
/ 21 декабря 2011

Когда я читаю ваш исходный код, у меня возникает две мысли:

  1. Вы используете слишком много тегов сценария (<%%>), даже для разделения кода VBScript.Это чрезмерное использование затрудняет чтение и понимание вашего кода.Мне пришлось вставить ваш исходный код в Notepad ++, чтобы привести в порядок и читать ваш код.
  2. Вы не использовали набор записей для первого запроса.Если вы хотите перебрать результат запроса Selectquery, используйте объект набора записей.Это более убедительно для обработки и предотвращает некоторые общие ошибки.Исключает ли использование набора записей вашу ошибку?

К вашей проблеме:

Используете ли вы IIS6.0 или выше?Если это так, то следующие идеи могут помочь (я получил это с немецкого! Сайта Microsoft, размещенного на stackoverflow.com (см. здесь ). Идеи:

  • Использование Response.Flush()
  • Выключите Response.Buffer на странице или на всем сайте. Response.Buffer = False вверху страницы перед любым кодом ASP.
  • Увеличьте размер буфера(см. ссылку в позиции «см. здесь»).
  • Уменьшите размер вашего ответа.
...