C#中常用的分頁存儲(chǔ)過程小結(jié)
1.分頁方案一:(利用Not In和SELECT TOP分頁)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁大小*頁數(shù) id
FROM 表
ORDER BY id))
ORDER BY ID
2.分頁方案二:(利用ID大于多少和SELECT TOP分頁)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 頁大小*頁數(shù) id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
3.分頁方案三:(利用SQL的游標(biāo)存儲(chǔ)過程分頁)
create procedure SqlPager
@sqlstr nvarchar(4000), --查詢字符串
@currentpage int, --第N頁
@pagesize int --每頁行數(shù)
as
set nocount on
declare @P1 int, --P1是游標(biāo)的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
4.
CREATE Procedure FramWorkPage
@TableName varchar(50), --表名
@Fields varchar(5000) = '*', --字段名(全部字段為*)
@OrderField varchar(5000), --排序字段(必須!支持多字段)
@sqlWhere varchar(5000) = Null,--條件語句(不用加where)
@pageSize int, --每頁多少條記錄
@pageIndex int = 1 , --指定當(dāng)前為第幾頁
@TotalPage int output, --返回條數(shù)
@OrderType bit -- 設(shè)置排序類型,1 升序 0 值則降序
as
begin
declare @strOrder varchar(400) -- 排序類型
Begin Tran --開始事務(wù)
Declare @sql nvarchar(4000);
Declare @totalRecord int;
--計(jì)算總記錄數(shù)
if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'select @totalRecord = count(*) from ' + @TableName
else
set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--計(jì)算總記錄數(shù)
--計(jì)算總頁數(shù)
select @TotalPage=@totalRecord --CEILING((@totalRecord+0.0)/@PageSize)
if @OrderType = 0
begin
set @strOrder = ' order by [' + @OrderField +'] desc'
--如果@OrderType是0,就執(zhí)行降序,這句很重要!
end
else
begin
set @strOrder = ' order by [' + @OrderField +'] asc'
end
if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere
--處理頁數(shù)超出范圍情況
if @PageIndex<=0
Set @pageIndex = 1
if @pageIndex>@TotalPage
Set @pageIndex = @TotalPage
--處理開始點(diǎn)和結(jié)束點(diǎn)
Declare @StartRecord int
Declare @EndRecord int
set @StartRecord = (@pageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @pageSize - 1
if @OrderType = 0
begin
set @strOrder = ' order by rowid desc'
--如果@OrderType是0,就執(zhí)行降序,這句很重要!
end
else
begin
set @strOrder = ' order by rowid asc'
end
--繼續(xù)合成sql語句
set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord) + ' '+@strOrder
-- print @sql
Exec(@Sql)
---------------------------------------------------
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @totalRecord ---返回記錄總數(shù)
End
end
通過上面這些東西的學(xué)習(xí)。我想一定可以找到一種滿意的答案。。。
- C#調(diào)用SQL?Server中有參數(shù)的存儲(chǔ)過程
- SQL Server存儲(chǔ)過程在C#中調(diào)用的簡單實(shí)現(xiàn)方法
- C# Ado.net實(shí)現(xiàn)讀取SQLServer數(shù)據(jù)庫存儲(chǔ)過程列表及參數(shù)信息示例
- C#執(zhí)行存儲(chǔ)過程并將結(jié)果填充到GridView的方法
- 使用C#代碼獲取存儲(chǔ)過程返回值
- c#獲取存儲(chǔ)過程返回值示例分享
- C#獲取存儲(chǔ)過程返回值和輸出參數(shù)值的方法
- C#中如何執(zhí)行存儲(chǔ)過程方法
- C#開發(fā)Winform程序調(diào)用存儲(chǔ)過程
相關(guān)文章
Asp.net GridView使用大全(分頁實(shí)現(xiàn))
關(guān)于GridView的使用涉及很多,網(wǎng)絡(luò)上零零散散的有一些,為了讓自己使用方便,也為了大家能很好的學(xué)習(xí)與工作,我把網(wǎng)絡(luò)上的GridView使用方法收集了一些2013-04-04在Asp.net下實(shí)現(xiàn)變長連接的web即時(shí)應(yīng)用的實(shí)現(xiàn)范例及ReverseAjax的演示介紹
根據(jù)公司近期的一個(gè)培訓(xùn)整理的資料,附件包括一個(gè)完整的使用變長連接的web即時(shí)聊天室的范例和針對(duì)ReverseAjax的ppt培訓(xùn)文稿,其中ppt中包含了對(duì)范例程序的完整講解2011-12-12ASP.NET DropDownListCheckBox使用示例(解決回發(fā)問題)
本文為大家介紹下ASP.NET DropDownListCheckBox的使用,這個(gè)是根據(jù)LigerUI改的,解決了回發(fā)問題,喜歡的朋友可以參考下2013-11-11Aspose.Cells 讀取受保護(hù)有密碼的Excel文件
這篇文章主要介紹了Aspose.Cells 讀取受保護(hù)有密碼的Excel文件,簡單實(shí)用,需要的朋友可以參考下。2016-06-06ASP.NET Core中的Razor頁面實(shí)現(xiàn)路由功能
本文詳細(xì)講解了ASP.NET Core中的Razor頁面實(shí)現(xiàn)路由功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02Asp.Net使用Npoi導(dǎo)入導(dǎo)出Excel的方法
這篇文章主要介紹了Asp.Net使用Npoi導(dǎo)入導(dǎo)出Excel的方法,采用該方法在導(dǎo)出Excel的時(shí)候不需要office組件的支持,而在導(dǎo)入Excel的時(shí)候采用OleDb的方式,需要office組件的支持。是一個(gè)非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09mssql 存儲(chǔ)過程調(diào)用C#編寫的DLL文件
有時(shí)候,我們會(huì)遇到這樣需求:存儲(chǔ)過程要調(diào)用外部的動(dòng)態(tài)鏈接庫文件,來實(shí)現(xiàn)某個(gè)功能。2009-05-05asp.net微信開發(fā)(高級(jí)群發(fā)圖文)
這篇文章主要介紹了asp.net微信開發(fā)中有關(guān)高級(jí)群發(fā)圖文的相關(guān)內(nèi)容,需要的朋友可以參考下2015-11-11