Как добавить подкачку для результатов в таблицу, созданную в Classic ASP? - PullRequest
0 голосов
/ 31 января 2019

У меня есть некоторый код в VBScript, который создает таблицу.В частности, код извлекает информацию из базы данных, а затем перебирает результаты, добавляя их в таблицу.Проблема в том, что в этой таблице 14 000 строк.Каждый раз, когда эта страница пытается загрузить, я получаю 500 Внутренняя ошибка сервера, которая, как я полагаю, связана с нехваткой памяти.

Для цикла у меня есть это:

<%
fHideNavBar = False
fHideNumber = False
fHideRequery = False
fHideRule = False
stQueryString = ""
fEmptyRecordset = False
fFirstPass = True
fNeedRecordset = False
fNoRecordset = False
tBarAlignment = "Left"
tHeaderName = "DataRangeHdr1"
tPageSize = 0
tPagingMove = ""
tRangeType = "Text"
tRecordsProcessed = 0
tPrevAbsolutePage = 0
intCurPos = 0
intNewPos = 0
fSupportsBookmarks = True
fMoveAbsolute = False

If IsEmpty(Session("DataRangeHdr1_Recordset")) Then
    fNeedRecordset = True
Else
    If Session("DataRangeHdr1_Recordset") Is Nothing Then
        fNeedRecordset = True
    Else
        Set DataRangeHdr1 = Session("DataRangeHdr1_Recordset")
    End If
End If

If fNeedRecordset Then
    Set DataConn = Server.CreateObject("ADODB.Connection")
    DataConn.Open "DSN=MYDSN","MyUserName","MyPassword"
    Set cmdTemp = Server.CreateObject("ADODB.Command")
    Set DataRangeHdr1 = Server.CreateObject("ADODB.Recordset")
    cmdTemp.CommandText = "SELECT PHONE, FAX, FIRM, ID FROM NNYBEA ORDER BY ID"
    cmdTemp.CommandType = 1

    Set cmdTemp.ActiveConnection = DataConn
    DataRangeHdr1.Open cmdTemp, , 0, 1
End If
On Error Resume Next
If DataRangeHdr1.BOF And DataRangeHdr1.EOF Then fEmptyRecordset = True
On Error Goto 0
If Err Then fEmptyRecordset = True

If Not IsEmpty(Session("DataRangeHdr1_Filter")) And Not fEmptyRecordset Then
    DataRangeHdr1.Filter = Session("DataRangeHdr1_Filter")
    If DataRangeHdr1.BOF And DataRangeHdr1.EOF Then fEmptyRecordset = True
End If

If fEmptyRecordset Then
    fHideNavBar = True
    fHideRule = True
End If
Do
    If fEmptyRecordset Then Exit Do
    If Not fFirstPass Then
        DataRangeHdr1.MoveNext
    Else
        fFirstPass = False
    End If
    If DataRangeHdr1.EOF Then Exit Do
%>
<tr>
<td><p align="center"><%= DataRangeHdr1("FIRM") %></td>
<td><p align="center"><%= DataRangeHdr1("PHONE") %></td>
<td><p align="center"><%= DataRangeHdr1("FAX") %></td>
<%end if%>
</tr>


<%
Loop%>

Теперь,Я считаю, что программист до меня по сути скопировал код с этого сайта: http://www.nnybe.com/board%20members/DEFAULT.ASP

На самом деле, я фактически изменил имена столбцов в моем цикле, чтобы они соответствовали сайту, поскольку он был очень похож (мой настоящий столбецимена разные).После цикла код, который я имею, выглядит следующим образом:

</TABLE>
<%
If tRangeType = "Table" Then Response.Write "</TABLE>"
If tPageSize > 0 Then
    If Not fHideRule Then Response.Write "<HR>"
    If Not fHideNavBar Then
        %>
        <TABLE WIDTH=100% >
        <TR>
            <TD WIDTH=100% >
                <P ALIGN=<%= tBarAlignment %> >
                <FORM <%= "ACTION=""" & Request.ServerVariables("PATH_INFO") & stQueryString & """" %> METHOD="POST">
                    <INPUT TYPE="Submit" NAME="<%= tHeaderName & "_PagingMove" %>" VALUE="   &lt;&lt;   ">
                    <INPUT TYPE="Submit" NAME="<%= tHeaderName & "_PagingMove" %>" VALUE="   &lt;    ">
                    <INPUT TYPE="Submit" NAME="<%= tHeaderName & "_PagingMove" %>" VALUE="    &gt;   ">
                    <% If fSupportsBookmarks Then %>
                        <INPUT TYPE="Submit" NAME="<%= tHeaderName & "_PagingMove" %>" VALUE="   &gt;&gt;   ">
                    <% End If %>
                    <% If Not fHideRequery Then %>
                        <INPUT TYPE="Submit" NAME="<% =tHeaderName & "_PagingMove" %>" VALUE=" Requery ">
                    <% End If %>
                </FORM>
                </P>
            </TD>
            <TD VALIGN=MIDDLE ALIGN=RIGHT>
                <FONT SIZE=2>
                <%
                If Not fHideNumber Then
                    If tPageSize > 1 Then
                        Response.Write "<NOBR>Page: " & Session(tHeaderName & "_AbsolutePage") & "</NOBR>"
                    Else
                        Response.Write "<NOBR>Record: " & Session(tHeaderName & "_AbsolutePage") & "</NOBR>"
                    End If
                End If
                %>
                </FONT>
            </TD>
        </TR>
        </TABLE>
    <%
    End If
End If
%>
</TABLE>

Я предполагаю, что из <и> вокруг части PagingMove это должно разрешить пейджинг.Однако я даже не вижу этого на своей странице.Я не знаю, работает ли код по приведенной выше ссылке на их веб-сайте, но для моего собственного веб-сайта я бы спросил:

Как я могу изменить этот код, чтобы предоставить возможность переходить по страницам данныхрезультат, так что серверу не хватает памяти?

Если есть более элегантное решение, способное выполнить то же самое, я бы это тоже оценил !!!

1 Ответ

0 голосов
/ 01 февраля 2019

В вашем SQL вы можете добавить смещение LIMIT

SELECT PHONE, FAX, FIRM, ID FROM NNYBEA ORDER BY ID LIMIT 0,10 ' Results 1 to 10
SELECT PHONE, FAX, FIRM, ID FROM NNYBEA ORDER BY ID LIMIT 10,10 ' 11 - 20
SELECT PHONE, FAX, FIRM, ID FROM NNYBEA ORDER BY ID LIMIT 20,10 ' 21 - 30
...

Если вы используете MySQL, вы можете использовать ...

SELECT SQL_CALC_FOUND_ROWS PHONE, FAX, FIRM, ID FROM NNYBEA ORDER BY ID LIMIT 0,10

..., чтобы получить общее количестворезультатов и рассчитайте количество отображаемых ссылок на страницы:

(total_results/results_per_page) ' and round up.

Затем создайте ссылку на страницы под таблицей результатов и передайте номера страниц в виде строки запроса:

default.asp?page=1
default.asp?page=2
default.asp?page=3
...

В верхней части страницы должен быть код, который получает запрошенный номер страницы и вычисляет правильное значение смещения:

<%

Const results_per_page = 10

Dim limit_offset, page_num

limit_offset = 0 ' default
page_num = request.querystring("page")

if isNumeric(page_num) then
    page_num = int(page_num)
    if page_num > 0 then
        limit_offset = (page_num-1)*results_per_page
    else
        page_num = 1 ' default   
    end if
else
    page_num = 1 ' default    
end if

%>

Наконец, примените смещение предела к вашему SQL:

cmdTemp.CommandText = "SELECT PHONE, FAX, FIRM, ID FROM NNYBEA ORDER BY ID LIMIT " & limit_offset & "," & results_per_page

Вы также можете использовать GetRows () для преобразования набора записей в двумерный массив и применения ограничения при цикле

Dim r, rs_loops, theData

theData = DataRangeHdr1.getRows()

rs_loops = page_num*results_per_page 

if rs_loops > uBound(theData,2) then rs_loops = uBound(theData,2)

for r = limit_offset to rs_loops

' output data from the DataRangeHdr1 recordset

%>

<tr>
<td><p align="center"><%= theData(2,r) ' firm %></td>
<td><p align="center"><%= theData(0,r) ' phone %></td>
<td><p align="center"><%= theData(1,r) ' fax %></td>
</tr>

<%

next

Но это будет означать хранение большого количества невидимых данных в памяти.Использование смещения LIMIT в SQL будет иметь больше смысла.

...