日期:2014-05-18  浏览次数:20565 次

问一下分页问题
小弟新手
目前在做一项目
对于分页问题
要求查询效率要高
想问一下大家有什么有什么好做法

另外想问一下
如果用SqlDataAdapter.Fill方法做分页的话效率如何
据说它不用取出所有数据
不知道是不是真的

------解决方案--------------------
2005做分页的话,不用写什么代码就可以搞定了!
用用存储过程分页,如:
EXEC p_splitpage @sql, @PageIndex ,@PageSize,0

p_splitpage 系统存储过程
@sql 为查询语句
@PageIndex 为起始页
,@PageSize 每页多少条记录
0 随便写的 不知道什么意思

------解决方案--------------------
参考:
http://www.codeproject.com/aspnet/PagingLarge.asp

我用的方法:(注意-----)
CREATE PROCEDURE [dbo].[usp_GetCompanyList]
@condition varchar(200),
@pagesize int,
@currentpage int,
@pagecount int out,
@rowcount int out
AS
BEGIN
CREATE TABLE #Temp(
[TempId] [int] IDENTITY(1,1) NOT NULL,
---------------
)
declare @sql varchar(1000)
set @sql = 'INSERT INTO #Temp (------------------)
SELECT ------ FROM [dbo].[Company] as C
join [dbo].[Server] as S on C.[ServerId]=S.[ServerId] where C.[IsDeleted]=0 '
if (@condition is not null and @condition <> ' ')
begin
set @sql = @sql + ' and ' + @condition
end
set @sql = @sql + ' order by C.[CompanyId] desc '

exec(@sql)

--返回总记录数
select @rowcount = count(0) from #Temp
--返回总页数
set @pagecount = ceiling(@rowcount * 1.0/@pagesize)

--临时表的起始Id
declare @FromId int
set @FromId = (@currentpage - 1) * @pagesize + 1
--临时表的结束Id
declare @ToId int
set @ToId = @currentpage * @pagesize

select * from #Temp where TempId between @FromId and @ToId
END
------解决方案--------------------
分页, 效率高, 填充当前页记录
--------------------------------------

public System.Int32 Fill ( System.Data.DataSet dataSet , System.Int32 startRecord , System.Int32 maxRecords , System.String srcTable )
System.Data.Common.DbDataAdapter 的成员

摘要:
在 System.Data.DataSet 的指定范围中添加或刷新行以匹配使用 System.Data.DataSet 和 System.Data.DataTable 名称的数据源中的行。

参数:
dataSet: 要用记录和架构(如果必要)填充的 System.Data.DataSet。
startRecord: 从其开始的从零开始的记录号。
maxRecords: 要检索的最大记录数。
srcTable: 用于表映射的源表的名称。

返回值:
已在 System.Data.DataSet 中成功添加或刷新的行数。这不包括受不返回行的语句影响的行。


------解决方案--------------------
fill方法有一个重载函数
其原形是:fill(System.Data.DataSet dataSet, int startRecord, int maxRecords, string srcTable)
第一个参数:要填充的数据集
第二个参数:要查找的开始记录编号(即从第几条记录开始)
第三个参数:每页的记录个数
第四个参数:表名
例如:startRecord = (curPage - 1) * pageSize,其中curPage是当前页数、pageSize是每页的记录个数,每次刷新页面通过改变startRecord参数来达到分页的目的。
------解决方案--------------------
fill方法只是从数据库读取相应的记录

不过再读取之前的消耗的就多了,比如排序,还要找第几条记录等等


------解决方案--------------------
分页通常都是在存储过程里做的,读出全部记录后再分的是效率很差的。
http://blog.csdn.net/banmuhuangci
请看最新的那篇文章