日期:2014-05-17  浏览次数:20553 次

请大家说说自己都是如何分页读取数据的?
记得前几天看到一个帖子,说面试经常问到要怎么读取第31-40条记录数据,看到大家都争先恐后地写各种sql语句

疑惑:分不分页读取数据?读第几条到第几条的数据?跟sql语句有关吗?
VB.NET code

CurrentIndex=4
PageSize=10
Dim da As OleDbDataAdapter = New OleDbDataAdapter(sql, conn)
Dim ds As DataSet = New DataSet()
da.Fill(ds, (CurrentIndex - 1) * PageSize, PageSize, "TmpTable")



上面是我写的分页读取数据代码,咋发现跟sql语句没有任何关系呀!

请大家说说自己都是如何分页读取数据的?

另外,我上面的代码是读取的全部的数据还是就读了10条数据?

------解决方案--------------------
本质都是要转化为SQL语句
mysql里面有limit,mssql没有,一般是top颠颠倒倒法或者row_number+between。
------解决方案--------------------
da.Fill(ds, (CurrentIndex - 1) * PageSize, PageSize, "TmpTable")
楼主的这个分页其实是假分页,数据表中记录数多时效率极低,因为你每次都把所有记录select出来,再由数据适配器选择出要的部分。
------解决方案--------------------
分页语句和说明参考:http://www.cnblogs.com/jyk/archive/2008/08/04/1260406.html
------解决方案--------------------
Dim da As OleDbDataAdapter = New OleDbDataAdapter(sql, conn)

这里有个参数sql. 把这个参数值贴出来 , 就知道了.

 应该是读的所有数据. 不是数据库分页.
------解决方案--------------------
探讨
Dim da As OleDbDataAdapter = New OleDbDataAdapter(sql, conn)

这里有个参数sql. 把这个参数值贴出来 , 就知道了.

应该是读的所有数据. 不是数据库分页.

------解决方案--------------------
看看这个,然后照着改:
SQL code

declare @iPageSize int =20
declare @iCurrentPage int =2

declare @sSql varchar(4000)=
'Select Top ' + convert(varchar,@iPageSize) + ' * from tblDiary where DiaryID 
not in
(
    select top ' + convert(varchar,@iPageSize  * @iCurrentPage) + ' DiaryID from tblDiary order by DiaryID asc
) order by DiaryID asc'

--PRINT @sSql

exec(@sSql)

------解决方案--------------------
C# code

public string GetSelectSectionSql(string select, string from, string where, string orderBy, int startIndex, int sectionSize)
        {
            return String.Format("select * from (select {0}, Row_Number() over (Order by {1}) as Row_Number from {2} where {3}) TempTable where Row_Number > {4} and Row_Number <= {5}", select, orderBy, from, where, startIndex, startIndex + sectionSize);
        }

------解决方案--------------------
用一条sql就可以了.
PageIndex,PageSize 这个是参数。


SQL code

int Start = ((PageIndex - 1) * PageSize) + 1;
            int End = (PageIndex) * PageSize;
            string sql = "select * from (select *,ROW_NUMBER() OVER(order by " + id + ") as rownumber  from table ) as tmp where rownumber between CAST(" + Start + " as varchar(10)) and CAST(" + End + " as varchar(10))