java 生成分页sql_DataGrid连接Access的快速分页法——动态生成SQL语句

作者:黎波usingSystem;usingSystem.Text;namespacePagi

作者:黎波

using System;

using System.Text;

namespace Paging

{

///

/// FastPaging 的摘要说明。

///

public class FastPaging {

private FastPaging() {

}

///

/// 获取根据指定字段排序并分页查询的 SELECT 语句。

///

/// 每页要显示的记录的数目。

/// 要显示的页的索引。

/// 数据表中的记录总数。

/// 要查询的数据表。

/// 要查询的字段。

/// 主键字段。

/// 是否为升序排列。

/// 查询的筛选条件。

/// 返回排序并分页查询的 SELECT 语句。

public static String Paging(

int pageSize,

int pageIndex,

int recordCount,

String tableName,

String queryFields,

String primaryKey,

bool ascending,

String condition )

{

#region 实现

StringBuilder sb    = new StringBuilder();

int pageCount       = GetPageCount(recordCount,pageSize);   //分页的总数

int middleIndex     = GetMidPageIndex(pageCount);           //中间页的索引

int firstIndex      = 0;                                    //第一页的索引

int lastIndex       = pageCount - 1;                        //最后一页的索引

#region @PageIndex <= @FirstIndex

if (pageIndex <= firstIndex) {

sb.Append("SELECT TOP ").Append(pageSize).Append(" ").Append(queryFields)

.Append(" FROM ").Append(tableName);

if (condition != String.Empty)

sb.Append(" WHERE ").Append(condition);

sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(ascending));

}

#endregion

#region @FirstIndex < @PageIndex <= @MiddleIndex

else if (pageIndex > firstIndex && pageIndex <= middleIndex) {

sb.Append("SELECT TOP ").Append(pageSize).Append(" ").Append(queryFields)

.Append(" FROM ").Append(tableName)

.Append(" WHERE ").Append(primaryKey);

if (ascending)

sb.Append(" > (").Append(" SELECT MAX(");

else

sb.Append(" < (").Append(" SELECT MIN(");

sb.Append(primaryKey).Append(") FROM ( SELECT TOP ")

.Append(pageSize*pageIndex).Append(" ").Append(primaryKey)

.Append(" FROM ").Append(tableName);

if (condition != String.Empty)

sb.Append(" WHERE ").Append(condition);

sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(ascending))

.Append(" ) TableA )");

if (condition != String.Empty)

sb.Append(" AND ").Append(condition);

sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(ascending));

}

#endregion

#region @MiddleIndex < @PageIndex < @LastIndex

else if (pageIndex > middleIndex && pageIndex < lastIndex) {

sb.Append("SELECT * FROM ( SELECT TOP ")

.Append(pageSize).Append(" ").Append(queryFields)

.Append(" FROM ").Append(tableName)

.Append(" WHERE ").Append(primaryKey);

if (ascending)

sb.Append(" < (").Append(" SELECT MIN(");

else

sb.Append(" > (").Append(" SELECT MAX(");

sb.Append(primaryKey).Append(") FROM ( SELECT TOP ")

.Append(recordCount-pageSize*(pageIndex+1)).Append(" ").Append(primaryKey)

.Append(" FROM ").Append(tableName);

if (condition != String.Empty)

sb.Append(" WHERE ").Append(condition);

sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(!ascending))

.Append(" ) TableA )");

if (condition != String.Empty)

sb.Append(" AND ").Append(condition);

sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(!ascending))

.Append(" ) TableB ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(ascending));

}

#endregion

#region @PageIndex >= @LastIndex

else if (pageIndex >= lastIndex) {

sb.Append("SELECT * FROM ( SELECT TOP ").Append(recordCount-pageSize*lastIndex)

.Append(" ").Append(queryFields)

.Append(" FROM ").Append(tableName);

if (condition != String.Empty)

sb.Append(" WHERE ").Append(condition);

sb.Append(" ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(!ascending))

.Append(" ) TableA ORDER BY ").Append(primaryKey).Append(" ")

.Append(GetSortType(ascending));

}

#endregion

return sb.ToString();

#endregion

}

///

/// 获取根据指定字段排序并分页查询的 SELECT 语句。

///

/// 每页要显示的记录的数目。

/// 要显示的页的索引。

/// 数据表中的记录总数。

/// 要查询的数据表。

/// 要查询的字段。

/// 主键字段。

public static String Paging(

int pageSize,

int pageIndex,

int recordCount,

String tableName,

String queryFields,

String primaryKey )

{

return Paging(pageSize, pageIndex, recordCount, tableName, queryFields, primaryKey,

true, String.Empty);

}

///

/// 获取根据指定字段排序并分页查询的 SELECT 语句。

///

/// 每页要显示的记录的数目。

/// 要显示的页的索引。

/// 数据表中的记录总数。

/// 要查询的数据表。

/// 要查询的字段。

/// 主键字段。

/// 是否为升序排列。

/// 返回排序并分页查询的 SELECT 语句。

public static String Paging(

int pageSize,

int pageIndex,

int recordCount,

String tableName,

String queryFields,

String primaryKey,

bool ascending )

{

return Paging(pageSize, pageIndex, recordCount, tableName, queryFields, primaryKey,

ascending, String.Empty);

}

///

/// 获取根据指定字段排序并分页查询的 SELECT 语句。

///

/// 每页要显示的记录的数目。

/// 要显示的页的索引。

/// 数据表中的记录总数。

/// 要查询的数据表。

/// 要查询的字段。

/// 主键字段。

/// 查询的筛选条件。

/// 返回排序并分页查询的 SELECT 语句。

public static String Paging(

int pageSize,

int pageIndex,

int recordCount,

String tableName,

String queryFields,

String primaryKey,

String condition )

{

return Paging(pageSize, pageIndex, recordCount, tableName, queryFields, primaryKey,

true, condition);

}

///

/// 计算分页数。

///

/// 表中得记录总数。

/// 每页显示的记录数。

/// 分页数。

public static int GetPageCount(int recordCount, int pageSize)

{

return (int)Math.Ceiling((double)recordCount/pageSize);

}

///

/// 计算中间页的页索引。

///

/// 分页数。

/// 中间页的页索引。

public static int GetMidPageIndex(int pageCount)

{

return (int)Math.Ceiling((double)pageCount/2) - 1;

}

///

/// 获取排序的方式("ASC" 表示升序,"DESC" 表示降序)。

///

/// 是否为升序。

/// 排序的方式("ASC" 表示升序,"DESC" 表示降序)。

public static String GetSortType(bool ascending)

{

return (ascending ? "ASC" : "DESC");

}

///

/// 获取一个布尔值,该值指示排序的方式是否为升序。

///

/// 排序的方式("ASC" 表示升序,"DESC" 表示降序)。

/// "ASC"则为 true;"DESC"则为 false;其它的为 true。

public static bool IsAscending(String orderType)

{

return ((orderType.ToUpper() == "DESC") ? false : true);

}

}

}

本文由来源 21aspnet,由 system_mush 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值