Необходимо преобразовать хранимую процедуру подкачки для больших наборов данных с использованием SQL Server 2005 - PullRequest
0 голосов
/ 18 сентября 2011

Сейчас код такой (для простоты, я еще не использовал объект команд ADO для предотвращения внедрения SQL).

У меня большой набор данных.Я использую метод getrows, который отлично подходит для получения наборов записей.Я не могу найти аналогичную хранимую процедуру для извлечения записей на основе того, какая у вас страница в браузере.

В основном sql извлекает 10 наборов записей относительно страницы, на которой находится браузер клиента.Он получает значение страницы из значения CurrPage.Я обрабатываю первую и последнюю страницы с помощью кода на стороне сервера, поэтому ошибок нет.

Любая помощь приветствуется.

If IsEmpty(Request.Querystring("pg")) then
CurrPage = 1
Else
CurrPage = Cint(Request.Querystring("pg"))
End If

RSPrevPage = CurrPage -1
RSNextPage = CurrPage + 1 

SQL = "SELECT gallerypublic.img, gallerypublic.galleryID, blahblahblah FROM gallerypublic INNER JOIN GalleryPublicCat ON gallerypublic.publicgallerycatid = GalleryPublicCat.pubcatID INNER JOIN userbase ON gallerypublic.userid = userbase.userid Order by galleryid desc"

Set rsFeed = Server.CreateObject("ADODB.Recordset")
rsFeed.Open sql, Conn, adOpenKeyset, adLockReadOnly
rsFeed.PageSize = 10
rsFeed.AbsolutePage = CurrPage
arrFeed = rsFeed.getrows(10)
intPageCount = rsFeed.PageCount
rsFeed.close
set rsFeed = Nothing

Я нашел эту хранимую процедуру в http://www.aspfaqs.com/webtech/042606-1.shtmlно я не могу перевести его на свои нужды.

TIA

После небольшой проб и ошибок вот рабочий код:

Сторона сервера:

    If IsEmpty(Request.Querystring("pg")) then
    CurrPage = 1
    Else
    CurrPage = Cint(Request.Querystring("pg"))
    End If

    RSPrevPage = CurrPage -1
    RSNextPage = CurrPage + 1

    pgSize = 10

    Set objCommandSec = CreateObject("ADODB.Command") 
    objCommandSec.ActiveConnection = Conn

    With objCommandSec
    Set .ActiveConnection = Conn
    .CommandType = adCmdStoredProc
    .CommandText = "spPageDef"
    .Parameters.Append .CreateParameter("@PageNum", 200, 1, 255, CurrPage)
    .Parameters.Append .CreateParameter("@PageSize", 200, 1, 255, pgSize)
    .Parameters.Append .CreateParameter("@TotalRowsNum", adInteger, adParamReturnValue)

    Set rsFeed = objCommandSec.Execute
    arrFeed = rsFeed.getrows()
    rsFeed.close
    set rsFeed = nothing

    intPageCount = cLng((.Parameters(2).value/pgSize))

    End With

Хранимая процедура:

    @PageNum int,
    @PageSize int,
    @TotalRowsNum int output

    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from

        -- interfering with SELECT statements.

        SET NOCOUNT ON;

        -- Use ROW_NUMBER function

        WITH DefaultEntries As
        (
            SELECT  
g.img, g.galleryID, g.viewed, g.votes, g.rate, g.created, blahblah,
'RowNumber' = ROW_NUMBER() OVER(ORDER BY galleryid DESC)

        FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid
        )

        -- Query result

        SELECT * 
        FROM DefaultEntries
        WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize             
        ORDER BY galleryid DESC

    SELECT @TotalRowsNum = count(galleryid) 
    FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid

    END

Спасибо всем, кто помог и указал мне правильное направление

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

хранимая процедура

    @PageNum int,
    @PageSize int,
    @TotalRowsNum int output

    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from

        -- interfering with SELECT statements.

        SET NOCOUNT ON;

        -- Use ROW_NUMBER function

        WITH DefaultEntries As
        (
            SELECT  
g.img, g.galleryID, g.viewed, g.votes, g.rate, g.created, blahblah,
'RowNumber' = ROW_NUMBER() OVER(ORDER BY galleryid DESC)

        FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid
        )

        -- Query result

        SELECT * 
        FROM DefaultEntries
        WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize             
        ORDER BY galleryid DESC

    SELECT @TotalRowsNum = count(galleryid) 
    FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid

    END

Серверная сторона

If IsEmpty(Request.Querystring("pg")) then
CurrPage = 1
Else
CurrPage = Cint(Request.Querystring("pg"))
End If

RSPrevPage = CurrPage -1
RSNextPage = CurrPage + 1

pgSize = 10

Set objCommandSec = CreateObject("ADODB.Command") 
objCommandSec.ActiveConnection = Conn

With objCommandSec
Set .ActiveConnection = Conn
.CommandType = adCmdStoredProc
.CommandText = "spPageDef"
.Parameters.Append .CreateParameter("@PageNum", 200, 1, 255, CurrPage)
.Parameters.Append .CreateParameter("@PageSize", 200, 1, 255, pgSize)
.Parameters.Append .CreateParameter("@TotalRowsNum", adInteger, adParamReturnValue)

Set rsFeed = objCommandSec.Execute
arrFeed = rsFeed.getrows()
rsFeed.close
set rsFeed = nothing

intPageCount = cLng((.Parameters(2).value/pgSize))

End With
0 голосов
/ 18 сентября 2011

Звучит так, будто вы хотите, чтобы ваша логика подкачки была в вашем сохраненном процессе.Похоже, вы используете SQL Server 2005. Предложите использовать CTE для реализации подкачки страниц и отказаться от реализации ADO.Предложить что-то вроде этого:

CREATE PROC     GetMyData
@PageSize INT,
@PageNumber INT,
@FirstRow INT
AS
DECLARE @LastRow INT;

SELECT   @FirstRow = ( @PageNumber - 1) * @PageSize + 1,
          @LastRow = (@PageNumber - 1) * @PageSize + @PageSize;

WITH MySet  AS
(
    SELECT ROW_NUMBER() OVER
               (ORDER BY galleryid DESC) AS RowNumber,
            g.img, 
            g.galleryID, 
            etc 
    FROM gallerypublic as g
    INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID 
    INNER JOIN userbase AS u ON g.userid = u.userid 
)
SELECT  RowNumber, 
        img, galleryid, etc
FROM    MySet
WHERE   RowNumber BETWEEN @FirstRow AND @LastRow
ORDER BY RowNumber ASC;
...