问一下分页问题
小弟新手
目前在做一项目
对于分页问题
要求查询效率要高
想问一下大家有什么有什么好做法
另外想问一下
如果用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
请看最新的那篇文章