国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > SQL Server > 正文

GridView自定義分頁(yè)的四種存儲(chǔ)過(guò)程

2020-07-25 13:28:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
1. 為什么不使用GridView的默認(rèn)分頁(yè)功能

首先要說(shuō)說(shuō)為什么不用GridView的默認(rèn)的分頁(yè)功能,GridView控件并非真正知道如何獲得一個(gè)新頁(yè)面,它只是請(qǐng)求綁定的數(shù)據(jù)源控件返回適合規(guī)定頁(yè)面的行,分頁(yè)最終是由數(shù)據(jù)源控件完成。當(dāng)我們使用SqlDataSource或使用以上的代碼處理分頁(yè)時(shí)。每次這個(gè)頁(yè)面被請(qǐng)求或者回發(fā)時(shí),所有和這個(gè)SELECT語(yǔ)句匹配的記錄都被讀取并存儲(chǔ)到一個(gè)內(nèi)部的DataSet中,但只顯示適合當(dāng)前頁(yè)面大小的記錄數(shù)。也就是說(shuō)有可能使用Select語(yǔ)句返回1000000條記錄,而每次回發(fā)只顯示10條記錄。如果啟用了SqlDataSource上的緩存,通過(guò)把EnableCaching設(shè)置為true,則情況會(huì)更好一些。在這種情況下,我們只須訪問(wèn)一次數(shù)據(jù)庫(kù)服務(wù)器,整個(gè)數(shù)據(jù)集只加載一次,并在指定的期限內(nèi)存儲(chǔ)在ASP.NET緩存中。只要數(shù)據(jù)保持緩存狀態(tài),顯示任何頁(yè)面將無(wú)須再次訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器。然而,可能有大量數(shù)據(jù)存儲(chǔ)在內(nèi)存中,換而言之,Web服務(wù)器的壓力大大的增加了。因此,如果要使用SqlDataSource來(lái)獲取較小的數(shù)據(jù)時(shí),GridView內(nèi)建的自動(dòng)分頁(yè)可能足夠高效了,但對(duì)于大數(shù)據(jù)量來(lái)說(shuō)是不合適的。

2. 分頁(yè)的四種存儲(chǔ)過(guò)程(分頁(yè)+排序的版本請(qǐng)參考Blog里其他文章)

在大多數(shù)情況下我們使用存儲(chǔ)過(guò)程來(lái)進(jìn)行分頁(yè),今天有空總結(jié)了一下使用存儲(chǔ)過(guò)程對(duì)GridView進(jìn)行分頁(yè)的4種寫(xiě)法(分別是使用Top關(guān)鍵字,臨時(shí)表,臨時(shí)表變量和SQL Server 2005 新加的Row_Number()函數(shù))

后續(xù)的文章中還將涉及GridView控件使用ObjectDataSource自定義分頁(yè) + 排序,Repeater控件自定義分頁(yè) + 排序,有興趣的朋友可以參考。
復(fù)制代碼 代碼如下:

if exists(select 1 from sys.objects where name = 'GetProductsCount' and type = 'P')
drop proc GetProductsCount
go
CREATE PROCEDURE GetProductsCount
as
select count(*) from products
go

--1.使用Top
if exists(select 1 from sys.objects where name = 'GetProductsByPage' and type = 'P')
drop proc GetProductsByPage
go
CREATE PROCEDURE GetProductsByPage
@PageNumber int,
@PageSize int
AS
declare @sql nvarchar(4000)
set @sql = 'select top ' + Convert(varchar, @PageSize)
+ ' * from products where productid not in (select top ' + Convert(varchar, (@PageNumber - 1) * @PageSize) + ' productid from products)'
exec sp_executesql @sql
go

--exec GetProductsByPage 1, 10
--exec GetProductsByPage 5, 10

--2.使用臨時(shí)表
if exists(select 1 from sys.objects where name = 'GetProductsByPage' and type = 'P')
drop proc GetProductsByPage
go
CREATE PROCEDURE GetProductsByPage
@PageNumber int,
@PageSize int
AS
-- 創(chuàng)建臨時(shí)表
CREATE TABLE #TempProducts
(
ID int IDENTITY PRIMARY KEY,
ProductID int,
ProductName varchar(40) ,
SupplierID int,
CategoryID int,
QuantityPerUnit nvarchar(20),
UnitPrice money,
UnitsInStock smallint,
UnitsOnOrder smallint,
ReorderLevel smallint,
Discontinued bit
)
-- 填充臨時(shí)表
INSERT INTO #TempProducts
(ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued)
SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued
FROM Products

DECLARE @FromID int
DECLARE @ToID int
SET @FromID = ((@PageNumber - 1) * @PageSize) + 1
SET @ToID = @PageNumber * @PageSize

SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued
FROM #TempProducts
WHERE ID >= @FromID AND ID <= @ToID
go

--exec GetProductsByPage 1, 10
--exec GetProductsByPage 5, 10

--3.使用表變量
/*
為要分頁(yè)的數(shù)據(jù)創(chuàng)建一個(gè)table變量,這個(gè)table變量里有一個(gè)作為主健的IDENTITY列.這樣需要分頁(yè)的每條記錄在table變量里就和一個(gè)row index(通過(guò)IDENTITY列)關(guān)聯(lián)起來(lái)了.一旦table變量產(chǎn)生,連接數(shù)據(jù)庫(kù)表的SELECT語(yǔ)句就被執(zhí)行,獲取需要的記錄.SET ROWCOUNT用來(lái)限制放到table變量里的記錄的數(shù)量.
當(dāng)SET ROWCOUNT的值指定為PageNumber * PageSize時(shí),這個(gè)方法的效率取決于被請(qǐng)求的頁(yè)數(shù).對(duì)于比較前面的頁(yè)來(lái)說(shuō) 主站蜘蛛池模板: 青龙| 壤塘县| 伊通| 休宁县| 彩票| 诸城市| 内江市| 高唐县| 金寨县| 中卫市| 柯坪县| 元阳县| 广安市| 灵武市| 德阳市| 偃师市| 瓦房店市| 静海县| 九龙城区| 仁化县| 阳原县| 会同县| 麦盖提县| 宜阳县| 桐梓县| 达日县| 讷河市| 醴陵市| 碌曲县| 任丘市| 昆山市| 芦溪县| 青川县| 邹平县| 克山县| 双柏县| 牙克石市| 大理市| 延庆县| 株洲市| 麻栗坡县|