asp.net安全、實(shí)用、簡(jiǎn)單的大容量存儲(chǔ)過(guò)程分頁(yè)第2/2頁(yè)
開始測(cè)試:
在BLL層(業(yè)務(wù)邏輯層),DAL層(數(shù)據(jù)訪問(wèn)層),DB(訪問(wèn)層基類),WEB(網(wǎng)站),關(guān)于3層結(jié)構(gòu)這里就不介紹了,大家可以看看我前面寫過(guò)的文章《.net三層結(jié)構(gòu)初探》 。
先添加存儲(chǔ)過(guò)程:
--阿會(huì)楠根據(jù)網(wǎng)絡(luò)上的代碼進(jìn)行了修改,版權(quán)歸原作者所有2009-4-5
--修改輸出總記錄數(shù)
create PROCEDURE [dbo].[pagination]
@tblName varchar(255), -- 表名
@strGetFields varchar(1000), -- 需要返回的列
@fldName varchar(255), -- 排序的字段名
@PageSize int, -- 頁(yè)尺寸
@PageIndex int, -- 頁(yè)碼
@OrderType bit, -- 設(shè)置排序類型, 非 0 值則降序
@strWhere varchar(1500), -- 查詢條件 (注意: 不要加 where)
@rowCount int output --查詢到的記錄數(shù)
AS
declare @strSQL varchar(5000) -- 主語(yǔ)句
declare @strTmp varchar(110) -- 臨時(shí)變量
declare @strOrder varchar(400) -- 排序類型
declare @strCountTmp nvarchar(100) --記錄數(shù)
declare @timediff datetime --耗時(shí)
begin
select @timediff = Getdate()
if @strWhere !=''
set @strCountTmp = 'select @rowCount = count(*) from [' + @tblName + '] where '+@strWhere
else
set @strCountTmp = 'select @rowCount = rowCount_tmp from tmp where (table_tmp = ''' + @tblName +''')'
exec sp_executesql @strCountTmp,N'@rowCount int out',@rowCount out --輸出總記錄數(shù)
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
--如果@OrderType不是0,就執(zhí)行降序,這句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder
--如果是第一頁(yè)就執(zhí)行以上代碼,這樣會(huì)加快執(zhí)行速度
end
else
begin
--以下代碼賦予了@strSQL以真正執(zhí)行的SQL代碼
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec (@strSQL)
select datediff(ms,@timediff,GetDate()) as runtime
這個(gè)SQL存儲(chǔ)過(guò)程語(yǔ)句非常的好,但是不足的地方就是如果你的條件語(yǔ)句中含有'(單引號(hào))那就很郁悶了,十分的麻煩。你可以試下改動(dòng)上面的相關(guān)代碼如下:
replace(@strWhere,'''','''''')
不放心自己測(cè)試下吧。
USE [data_Test]
GO
DECLARE @return_value int,
@rowCount int
EXEC @return_value = [dbo].[pagination]
@tblName = 'userinfo',
@strGetFields = N'id',
@fldName = N'id',
@PageSize = 10,
@PageIndex = 300,
@OrderType = 0,
@strWhere = null,
@rowCount = @rowCount OUTPUT
SELECT @rowCount as N'@rowCount'
SELECT 'Return Value' = @return_value
GO
最主要的DAL層代碼:
public DataSet GetList(int PageIndex, string strWhere,ref int rowCount)
{
SqlParameter[] parameter = sosuo8.DBUtility.DbHelperSQL.pagePara();
parameter[0].Value = "userinfo";
parameter[1].Value = "id,userName,userWebName,createDate";
parameter[2].Value = "id";
parameter[3].Value = 10;
parameter[4].Value = PageIndex;
parameter[5].Value = 0;
parameter[6].Value = strWhere;
parameter[7].Direction = ParameterDirection.Output;//聲明為輸出類型
DataSet ds = sosuo8.DBUtility.DbHelperSQL.RunProcedure("pagination",parameter,"userinfo");
rowCount = Convert.ToInt32(parameter[7].Value);
return ds;
}
全部代碼:
public DataSet GetList(int iPageSize, int iPageIndex, string strWhere, ref int iCount)
{
SqlParameter[] parameters ={
new SqlParameter("@tblName",SqlDbType.VarChar,255),
new SqlParameter("@strGetFields",SqlDbType.VarChar,1000),
new SqlParameter("@fldName",SqlDbType.VarChar,255),
new SqlParameter("@PageSize",SqlDbType.Int),
new SqlParameter("@PageIndex",SqlDbType.Int),
new SqlParameter("@OrderType",SqlDbType.Int),
new SqlParameter("@strWhere",SqlDbType.NVarChar,2000),
new SqlParameter("@rowCount",SqlDbType.Int),
};
parameters[0].Value = "News";
parameters[1].Value = "newsID,classID,title,picUrl,videoUrl,writer,source,province,addTime,istop,state,keywords,recommend,hits,htmlPath,pic1,pic2,pic3";
parameters[2].Value = "addTime";
parameters[3].Value = iPageSize;
parameters[4].Value = iPageIndex;
parameters[5].Value = 1;
parameters[6].Value = strWhere;
parameters[7].Direction = ParameterDirection.Output;//聲明為輸出類型
DataSet ds = sosuo8.DBUtility.DbHelperSQL.RunProcedure("GetRecordByPage", parameters, "News");
iCount = Convert.ToInt32(parameters[7].Value);
return ds;
}
default.aspx.cs代碼
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
bind();
}
}
private void bind()//綁定數(shù)據(jù)
{
this.anPager.PageSize = 10;//每頁(yè)記錄數(shù)
this.anPager.AlwaysShow = true;//是否一直顯示分頁(yè)
int rowCount = 0;//初始化記錄數(shù)為0
string wherestr = string.Empty;//搜索關(guān)鍵字,這部分后面我在講講優(yōu)化
sosuo8.BLL.bll_test bll = new sosuo8.BLL.bll_test();
this.rpt.DataSource = bll.GetList(this.anPager.CurrentPageIndex,wherestr,ref rowCount);//rowCount在經(jīng)過(guò)這個(gè)函數(shù)后,返回的是重新賦值的記錄總數(shù)
this.anPager.RecordCount = rowCount;
this.rpt.DataBind();
}
protected void anPager_PageChanging(object src, Wuqi.Webdiyer.PageChangingEventArgs e)
{
this.anPager.CurrentPageIndex = e.NewPageIndex;
bind();
}
}
里面涉及到aspnetpager的使用,如果你還不會(huì)使用這個(gè)控件,可以自己看看有關(guān)教程。最終的界面如下:

令我十分高興的是,在處理520W的記錄時(shí),它速度還在可以接受的范圍內(nèi),不會(huì)出現(xiàn)超時(shí)的現(xiàn)象。而作為優(yōu)化,可以在界面層中盡量少讀數(shù)據(jù)。可以加上以page為參數(shù)頁(yè)面輸出緩存:
<%@ OutputCache Duration="360" VaryByParam="page" %>
你也許并沒(méi)有用過(guò)里面的一些控件,但是知道原理和方法我相信你也可以自由搭配你需要的東西,下面我僅上傳部分比較重要的代碼,對(duì)于需要的控件我也放在里面,至于建表測(cè)試那些大家慢慢研究吧!當(dāng)前的存儲(chǔ)過(guò)程只能針對(duì)一個(gè)字段排序,后面有時(shí)間我會(huì)修改成多字段排序
打包下載地址
- asp.net安全、實(shí)用、簡(jiǎn)單的大容量存儲(chǔ)過(guò)程分頁(yè)
- asp.net 結(jié)合mysql存儲(chǔ)過(guò)程進(jìn)行分頁(yè)代碼
- asp.net 存儲(chǔ)過(guò)程調(diào)用
- 在ASP.NET中用存儲(chǔ)過(guò)程執(zhí)行SQL語(yǔ)句
- asp.net sql存儲(chǔ)過(guò)程
- asp.net利用存儲(chǔ)過(guò)程和div+css實(shí)現(xiàn)分頁(yè)(類似于博客園首頁(yè)分頁(yè))
- asp.net結(jié)合aspnetpager使用SQL2005的存儲(chǔ)過(guò)程分頁(yè)
- ASP.NET 獲取存儲(chǔ)過(guò)程返回值的實(shí)現(xiàn)代碼
- asp.net中IDataParameter調(diào)用存儲(chǔ)過(guò)程的實(shí)現(xiàn)方法
- asp.net中調(diào)用存儲(chǔ)過(guò)程的方法
相關(guān)文章
Asp.Net防止刷新重復(fù)提交數(shù)據(jù)的辦法
最近在用Asp.Net編寫點(diǎn)東西時(shí)遇到個(gè)問(wèn)題:即用戶在提交表單后按刷新就會(huì)重復(fù)提交數(shù)據(jù),即所謂的“刷新重復(fù)提交”的問(wèn)題。2013-03-03ASP.NET中后臺(tái)注冊(cè)js腳本使用的方法對(duì)比
接下來(lái)為大家介紹下使用Page.ClientScript.RegisterClientScriptBlock 和Page.ClientScript.RegisterStartupScript:區(qū)別2013-04-04.Net 調(diào)用存儲(chǔ)過(guò)程取到return的返回值
存儲(chǔ)過(guò)程只能返回 int 類型,如果返回一個(gè)字符串 ,將會(huì)報(bào)類型轉(zhuǎn)化錯(cuò)誤,下面以示例介紹下如何取到return的值,需要的朋友可以參考下2014-08-08ASP.NET?Core?MVC自定義Tag?Helpers用法介紹
這篇文章介紹了ASP.NET?Core?MVC自定義Tag?Helpers的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02MVC+EasyUI+三層新聞網(wǎng)站建立 實(shí)現(xiàn)登錄功能(四)
這篇文章主要為大家詳細(xì)介紹了MVC+EasyUI+三層新聞網(wǎng)站建立的第四篇,教大家實(shí)現(xiàn)登錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07基于.net core微服務(wù)的另一種實(shí)現(xiàn)方法
這篇文章主要給大家介紹了基于.net core微服務(wù)的另一種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付實(shí)現(xiàn)代碼
這篇文章主要介紹了ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-10-10ASP.NET Core使用GraphQL第一章之Hello World
這篇文章主要給大家介紹了關(guān)于ASP.NET Core使用GraphQL第一章之Hello World的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Asp.Net網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫(kù)的優(yōu)化措施與索引優(yōu)化方法
索引的作用就類似于書的目錄,書的目錄會(huì)按照章節(jié)的順序排列,會(huì)指想某一張的位置。這樣如果在一本數(shù)百頁(yè)的書里面查找某個(gè)章節(jié)位置的時(shí)候,我們就可以只掃描書的目錄,掃描的范圍縮小了n倍,查詢的效率自然就提高了。2010-06-06