最近做几个项目全使用ACCESS数据库,少了存储过程,对数据分页处理有些不太习惯,查了一些资料,设计了一个数据分页类,分四种情况对SQL语句分别处理,自己做个纪录,代码如下:
Public Class DataHelper

    
''' <summary>SQL语句处理数据分页</summary>
    ''' <param name="pageSize">分量,每页纪录数量</param>
    ''' <param name="pageIndex">当前页</param>
    ''' <param name="recordCount">纪录总数</param>
    ''' <param name="tableName">选取的数据表</param>
    ''' <param name="Fields">选取的数据字段</param>
    ''' <param name="primaryKey">字段主键</param>
    ''' <param name="ascending">是否正向排序</param>
    ''' <param name="condition">选取条件,Where字句</param>
    ''' <returns>返回SQL语句</returns>
    Public Shared Function Paging(ByVal pageSize As IntegerByVal pageIndex As IntegerByVal recordCount As IntegerByVal tableName As StringByVal Fields As StringByVal primaryKey As StringByVal ascending As BooleanByVal condition As StringAs String
        
Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder
        
Dim pageCount As Integer = GetPageCount(recordCount, pageSize)
        
Dim middleIndex As Integer = GetMidPageIndex(pageCount)
        
Dim firstIndex As Integer = 0
        
Dim lastIndex As Integer = pageCount - 1

        
If pageIndex <= firstIndex Then
            
Dim sql As String = "SELECT TOP {0} {1} FROM {2} WHERE {3} ORDER BY {4} {5}"
            sb.AppendFormat(sql, pageSize, Fields, tableName, condition, primaryKey, GetSortType(ascending))
        
ElseIf pageIndex > firstIndex AndAlso pageIndex <= middleIndex Then
            
Dim sql As String = "SELECT TOP {0} {1} FROM {2} WHERE {3} < (SELECT MIN({3}) FROM (SELECT TOP {4} {3} FROM {2} WHERE {5} ORDER BY {3} DESC) ta) ORDER BY {3} DESC"
            If ascending Then sql = "SELECT TOP {0} {1} FROM {2} WHERE {3} > (SELECT MAX({3}) FROM (SELECT TOP {4} {3} FROM {2} WHERE {5} ORDER BY {3} ASC) ta) ORDER BY {3} ASC"
            sb.AppendFormat(sql, pageSize, Fields, tableName, primaryKey, pageSize * pageIndex, condition)
        
ElseIf pageIndex > middleIndex AndAlso pageIndex < lastIndex Then
            
Dim sql As String = "SELECT * FROM (SELECT TOP {0} {1} FROM {2} WHERE {3} > (SELECT MAX({3}) FROM (SELECT TOP {4} {3} FROM {2} WHERE {5} ORDER BY {3} ASC ) ta) ORDER BY {3} ASC) tb ORDER BY {3} DESC"
            If ascending Then sql = "SELECT * FROM (SELECT TOP {0} {1} FROM {2} WHERE {3} < (SELECT MIN({3}) FROM (SELECT TOP {4} {3} FROM {2} WHERE {5} ORDER BY {3} DESC) ta) ORDER BY {3} DESC)  tb ORDER BY {3} ASC"
            sb.AppendFormat(sql, pageSize, Fields, tableName, primaryKey, recordCount - pageSize * (pageIndex + 1), condition)
        
ElseIf pageIndex >= lastIndex Then
            
Dim sql As String = "SELECT * FROM (SELECT TOP {0} {1} FROM {2} WHERE {3} ORDER BY {4} {5}) ta ORDER BY {4} {6}"
            sb.AppendFormat(sql, recordCount - pageSize * lastIndex, Fields, tableName, condition, primaryKey, GetSortType(Not ascending), GetSortType(ascending))
        
End If
        
Return sb.ToString
    
End Function


    
Public Shared Function GetPageCount(ByVal recordCount As IntegerByVal pageSize As IntegerAs Integer
        
Return CType(Math.Ceiling(CType(recordCount, Double/ pageSize), Integer)
    
End Function


    
Public Shared Function GetMidPageIndex(ByVal pageCount As IntegerAs Integer
        
Return CType(Math.Ceiling(CType(pageCount, Double/ 2), Integer- 1
    
End Function


    
Public Shared Function GetSortType(ByVal ascending As BooleanAs String
        
Return (Microsoft.VisualBasic.IIf(ascending, "ASC""DESC"))
    
End Function


End Class


PS:在ACCESS下我比较喜欢使用查询代替直接使用复杂的SQL语句,觉得设计方便,使用也方便,不知道对性能有什么影响。
posted @ 2005-05-23 00:31 七月(Lost) 阅读(850) | 评论 (0)编辑