DataGrid连接Access的快速分页法(4)——动态生成SQL语句

DataGrid连接Access的快速分页法(4)——动态生成SQL语句

using System;

using System.Text;

namespace Paging

{

///

1<summary>
2
3/// FastPaging 的摘要说明。 
4
5/// </summary>

public class FastPaging {

private FastPaging() {

}

///

1<summary>
2
3/// 获取根据指定字段排序并分页查询的 SELECT 语句。 
4
5/// </summary>

///

1<param name="pageSize"/>

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

///

1<param name="pageIndex"/>

要显示的页的索引。

///

1<param name="recordCount"/>

数据表中的记录总数。

///

1<param name="tableName"/>

要查询的数据表。

///

1<param name="queryFields"/>

要查询的字段。

///

1<param name="primaryKey"/>

主键字段。

///

1<param name="ascending"/>

是否为升序排列。

///

1<param name="condition"/>

查询的筛选条件。

///

1<returns>返回排序并分页查询的 SELECT 语句。</returns>

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

}

///

1<summary>
2
3/// 获取根据指定字段排序并分页查询的 SELECT 语句。 
4
5/// </summary>

///

1<param name="pageSize"/>

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

///

1<param name="pageIndex"/>

要显示的页的索引。

///

1<param name="recordCount"/>

数据表中的记录总数。

///

1<param name="tableName"/>

要查询的数据表。

///

1<param name="queryFields"/>

要查询的字段。

///

1<param name="primaryKey"/>

主键字段。

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);

}

///

1<summary>
2
3/// 获取根据指定字段排序并分页查询的 SELECT 语句。 
4
5/// </summary>

///

1<param name="pageSize"/>

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

///

1<param name="pageIndex"/>

要显示的页的索引。

///

1<param name="recordCount"/>

数据表中的记录总数。

///

1<param name="tableName"/>

要查询的数据表。

///

1<param name="queryFields"/>

要查询的字段。

///

1<param name="primaryKey"/>

主键字段。

///

1<param name="ascending"/>

是否为升序排列。

///

1<returns>返回排序并分页查询的 SELECT 语句。</returns>

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);

}

///

1<summary>
2
3/// 获取根据指定字段排序并分页查询的 SELECT 语句。 
4
5/// </summary>

///

1<param name="pageSize"/>

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

///

1<param name="pageIndex"/>

要显示的页的索引。

///

1<param name="recordCount"/>

数据表中的记录总数。

///

1<param name="tableName"/>

要查询的数据表。

///

1<param name="queryFields"/>

要查询的字段。

///

1<param name="primaryKey"/>

主键字段。

///

1<param name="condition"/>

查询的筛选条件。

///

1<returns>返回排序并分页查询的 SELECT 语句。</returns>

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);

}

///

1<summary>
2
3/// 计算分页数。 
4
5/// </summary>

///

1<param name="recordCount"/>

表中得记录总数。

///

1<param name="pageSize"/>

每页显示的记录数。

///

1<returns>分页数。</returns>

public static int GetPageCount(int recordCount, int pageSize)

{

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

}

///

1<summary>
2
3/// 计算中间页的页索引。 
4
5/// </summary>

///

1<param name="pageCount"/>

分页数。

///

1<returns>中间页的页索引。</returns>

public static int GetMidPageIndex(int pageCount)

{

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

}

///

1<summary>
2
3/// 获取排序的方式("ASC" 表示升序,"DESC" 表示降序)。 
4
5/// </summary>

///

1<param name="ascending"/>

是否为升序。

///

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

public static String GetSortType(bool ascending)

{

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

}

///

1<summary>
2
3/// 获取一个布尔值,该值指示排序的方式是否为升序。 
4
5/// </summary>

///

1<param name="orderType"/>

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

///

1<returns>"ASC"则为 true;"DESC"则为 false;其它的为 true。</returns>

public static bool IsAscending(String orderType)

{

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

}

}

}

作者:黎波

Published At
Categories with Web编程
Tagged with
comments powered by Disqus