C#怎么将从数据库提出来的文章分页

C#怎么将从数据库提出来的文章分页,第1张

sql分页不一定用存储过程,就过个人认为存储过程尽量少用!

--前提是必需有一列是自动增长类型,唯一性

--方法一

SELECT DISTINCT TOP 8 CategoryID

FROM tbl_Product_Products

WHERE (UserID = 73) AND (CategoryID >

(SELECT MAX(categoryid)

FROM (SELECT DISTINCT TOP 16 categoryid

FROM tbl_product_products where userid=73

ORDER BY categoryid) AS b))

ORDER BY CategoryID

--方法二

select top 10 from [order details]

where orderid>all(select top 10 orderid from [order details] order by orderid)

order by orderid

下面的来自CSDN-------------------------------------

SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点

建立表:

CREATE TABLE [TestTable] (

[ID] [int] IDENTITY (1, 1) NOT NULL ,

[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO

插入数据:(2万条,用更多的数据测试会明显一些)

SET IDENTITY_INSERT TestTable ON

declare @i int

set @i=1

while @i<=20000

begin

insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')

set @i=@i+1

end

SET IDENTITY_INSERT TestTable OFF

-------------------------------------

分页方案一:(利用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 页大小页数 id

FROM 表

ORDER BY id))

ORDER BY ID

-------------------------------------

分页方案二:(利用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 页大小页数 id

FROM 表

ORDER BY id) AS T))

ORDER BY ID

-------------------------------------

分页方案三:(利用SQL的游标存储过程分页)

create procedure XiaoZhengGe

@sqlstr nvarchar(4000), --查询字符串

@currentpage int, --第N页

@pagesize int --每页行数

as

set nocount on

declare @P1 int, --P1是游标的id

@rowcount int

exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output

select ceiling(10@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页

set @currentpage=(@currentpage-1)@pagesize+1

exec sp_cursorfetch @P1,16,@currentpage,@pagesize

exec sp_cursorclose @P1

set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。

建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:

分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句

分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句

分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

在实际情况中,要具体分析。

分两步实现

一、分页的存储过程如下

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go

CREATE PROCEDURE [dbo][Pagination]

@tblName varchar(255), -- 表名

@strGetFields varchar(1000) , -- 需要返回的列

@fldName varchar(255), -- 排序的字段名

@PageSize int, -- 页尺寸

@PageIndex int , -- 页码

@doCount bit=0, -- 返回记录总数, 非 0 值则返回

@OrderType bit, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1500) -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000) -- 主语句

declare @strTmp varchar(110) -- 临时变量

declare @strOrder varchar(400) -- 排序类型

if @doCount != 0

begin

if @strWhere !=''

set @strSQL = 'select count() as Total from [' + @tblName + '] where ' + @strWhere

else

set @strSQL = 'select count() as Total from [' + @tblName + ']'

end

--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

else

begin

if @OrderType != 0

begin

set @strTmp = '<(select min'

set @strOrder = ' order by [' + @fldName + '] desc'

end

--如果@OrderType不是0,就执行降序,这句很重要!

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

end

--如果是第一页就执行以上代码,这样会加快执行速度

else

begin

--以下代码赋予了@strSQL以真正执行的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)

二、页面调用部分代码

Function navindex(ByVal PageIndextemp As Integer, ByVal PageSizetemp As Integer, ByVal countint As Integer, ByVal pagename As String) As String

Dim i As Integer

If countint Mod PageSizetemp = 0 Then

i = countint \ PageSizetemp

Else

i = countint \ PageSizetemp + 1

End If

Dim maxi, mini As Integer

Dim navleft, navright, navstrtemp As String

If i < 10 Then

maxi = i

mini = 1

Else

maxi = pageindex + 3

mini = pageindex - 3

If mini > 1 Then

navleft = "<a href=""" & pagename & "page=" & (mini - 1) & """ class=""link_nav_btn""><</a> "

Else

mini = 1

maxi = 10

End If

If maxi < i Then

navright = " <a href=""" & pagename & "page=" & (maxi + 1) & """ class=""link_nav_btn"">></a>"

Else

If i - 10 > 0 Then

mini = i - 10

Else

mini = 1

End If

maxi = i

End If

End If

For n As Integer = mini To maxi

If n = pageindex Then

navstrtemp = navstrtemp & " <a href=""" & pagename & "page=" & n & """ class=""link_nav_btn_select""><b>" & n & "</b></a>"

Else

navstrtemp = navstrtemp & " <a href=""" & pagename & "page=" & n & """ class=""link_nav_btn"">" & n & "</a>"

End If

Next

navstrtemp = navleft & navstrtemp & navright

Return navstrtemp

End Function

Sub databinds(ByVal tblnametemp As String, ByVal strGetFieldstemp As String, ByVal fldNametemp As String, ByVal PageSizetemp As Integer, ByVal PageIndextemp As Integer, ByVal OrderTypetemp As Short, ByVal strWheretemp As String)

'tblnametemp表名,strGetFieldstemp需要返回的列,fldNametemp排序的字段名,PageSizetemp页尺寸,PageIndextemp页码,OrderTypetemp设置排序类型,strWheretemp查询条件

'总数

cmdTM = New SqlCommand("select count() from " & tblnametemp & " where " & strWheretemp, conPubs)

conPubsOpen()

countint = CInt(cmdTMExecuteScalar())

conPubsClose()

'导航

navstr = navindex(PageIndextemp, PageSizetemp, countint, "newshyxhaspx")

'分页

cmdTM = New SqlCommand("Pagination", conPubs)

cmdTMCommandType = CommandTypeStoredProcedure

'add input

cmdTMParametersAdd("@tblName", SqlDbTypeVarChar, 255)Value = tblnametemp

cmdTMParametersAdd("@strGetFields", SqlDbTypeVarChar, 1000)Value = strGetFieldstemp

cmdTMParametersAdd("@fldName", SqlDbTypeVarChar, 255)Value = fldNametemp

cmdTMParametersAdd("@PageIndex", SqlDbTypeInt)Value = PageIndextemp

cmdTMParametersAdd("@PageSize", SqlDbTypeInt)Value = PageSizetemp

cmdTMParametersAdd("@OrderType", SqlDbTypeBit)Value = OrderTypetemp

cmdTMParametersAdd("@strWhere", SqlDbTypeVarChar, 1500)Value = strWheretemp

conPubsOpen()

newsrightDataSource = cmdTMExecuteReader()

newsrightDataBind()

conPubsClose()

End Sub

以上就是关于C#怎么将从数据库提出来的文章分页全部的内容,包括:C#怎么将从数据库提出来的文章分页、sqlserver 2005数据库 怎么进行分页、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10170958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存