DataGrid连接Access的快速分页法——动态生成SQL语句
生活随笔
收集整理的這篇文章主要介紹了
DataGrid连接Access的快速分页法——动态生成SQL语句
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者:黎波
using System; using System.Text; namespace Paging { /// <summary> /// FastPaging 的摘要說(shuō)明。 /// </summary> public class FastPaging { private FastPaging() { } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> /// <param name="ascending">是否為升序排列。</param> /// <param name="condition">查詢的篩選條件。</param> /// <returns>返回排序并分頁(yè)查詢的 SELECT 語(yǔ)句。</returns> public static String Paging( int pageSize, int pageIndex, int recordCount, String tableName, String queryFields, String primaryKey, bool ascending, String condition ) { #region 實(shí)現(xiàn) StringBuilder sb??? = new StringBuilder(); int pageCount?????? = GetPageCount(recordCount,pageSize);?? //分頁(yè)的總數(shù) int middleIndex???? = GetMidPageIndex(pageCount);?????????? //中間頁(yè)的索引 int firstIndex????? = 0;??????????????????????????????????? //第一頁(yè)的索引 int lastIndex?????? = pageCount - 1;??????????????????????? //最后一頁(yè)的索引 #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 } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> 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); } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> /// <param name="ascending">是否為升序排列。</param> /// <returns>返回排序并分頁(yè)查詢的 SELECT 語(yǔ)句。</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); } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> /// <param name="condition">查詢的篩選條件。</param> /// <returns>返回排序并分頁(yè)查詢的 SELECT 語(yǔ)句。</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); } /// <summary> /// 計(jì)算分頁(yè)數(shù)。 /// </summary> /// <param name="recordCount">表中得記錄總數(shù)。</param> /// <param name="pageSize">每頁(yè)顯示的記錄數(shù)。</param> /// <returns>分頁(yè)數(shù)。</returns> public static int GetPageCount(int recordCount, int pageSize) { return (int)Math.Ceiling((double)recordCount/pageSize); } /// <summary> /// 計(jì)算中間頁(yè)的頁(yè)索引。 /// </summary> /// <param name="pageCount">分頁(yè)數(shù)。</param> /// <returns>中間頁(yè)的頁(yè)索引。</returns> public static int GetMidPageIndex(int pageCount) { return (int)Math.Ceiling((double)pageCount/2) - 1; } /// <summary> /// 獲取排序的方式("ASC" 表示升序,"DESC" 表示降序)。 /// </summary> /// <param name="ascending">是否為升序。</param> /// <returns>排序的方式("ASC" 表示升序,"DESC" 表示降序)。</returns> public static String GetSortType(bool ascending) { return (ascending ? "ASC" : "DESC"); } /// <summary> /// 獲取一個(gè)布爾值,該值指示排序的方式是否為升序。 /// </summary> /// <param name="orderType">排序的方式("ASC" 表示升序,"DESC" 表示降序)。</param> /// <returns>"ASC"則為 true;"DESC"則為 false;其它的為 true。</returns> public static bool IsAscending(String orderType) { return ((orderType.ToUpper() == "DESC") ? false : true); } } } ?
using System; using System.Text; namespace Paging { /// <summary> /// FastPaging 的摘要說(shuō)明。 /// </summary> public class FastPaging { private FastPaging() { } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> /// <param name="ascending">是否為升序排列。</param> /// <param name="condition">查詢的篩選條件。</param> /// <returns>返回排序并分頁(yè)查詢的 SELECT 語(yǔ)句。</returns> public static String Paging( int pageSize, int pageIndex, int recordCount, String tableName, String queryFields, String primaryKey, bool ascending, String condition ) { #region 實(shí)現(xiàn) StringBuilder sb??? = new StringBuilder(); int pageCount?????? = GetPageCount(recordCount,pageSize);?? //分頁(yè)的總數(shù) int middleIndex???? = GetMidPageIndex(pageCount);?????????? //中間頁(yè)的索引 int firstIndex????? = 0;??????????????????????????????????? //第一頁(yè)的索引 int lastIndex?????? = pageCount - 1;??????????????????????? //最后一頁(yè)的索引 #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 } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> 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); } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> /// <param name="ascending">是否為升序排列。</param> /// <returns>返回排序并分頁(yè)查詢的 SELECT 語(yǔ)句。</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); } /// <summary> /// 獲取根據(jù)指定字段排序并分頁(yè)查詢的 SELECT 語(yǔ)句。 /// </summary> /// <param name="pageSize">每頁(yè)要顯示的記錄的數(shù)目。</param> /// <param name="pageIndex">要顯示的頁(yè)的索引。</param> /// <param name="recordCount">數(shù)據(jù)表中的記錄總數(shù)。</param> /// <param name="tableName">要查詢的數(shù)據(jù)表。</param> /// <param name="queryFields">要查詢的字段。</param> /// <param name="primaryKey">主鍵字段。</param> /// <param name="condition">查詢的篩選條件。</param> /// <returns>返回排序并分頁(yè)查詢的 SELECT 語(yǔ)句。</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); } /// <summary> /// 計(jì)算分頁(yè)數(shù)。 /// </summary> /// <param name="recordCount">表中得記錄總數(shù)。</param> /// <param name="pageSize">每頁(yè)顯示的記錄數(shù)。</param> /// <returns>分頁(yè)數(shù)。</returns> public static int GetPageCount(int recordCount, int pageSize) { return (int)Math.Ceiling((double)recordCount/pageSize); } /// <summary> /// 計(jì)算中間頁(yè)的頁(yè)索引。 /// </summary> /// <param name="pageCount">分頁(yè)數(shù)。</param> /// <returns>中間頁(yè)的頁(yè)索引。</returns> public static int GetMidPageIndex(int pageCount) { return (int)Math.Ceiling((double)pageCount/2) - 1; } /// <summary> /// 獲取排序的方式("ASC" 表示升序,"DESC" 表示降序)。 /// </summary> /// <param name="ascending">是否為升序。</param> /// <returns>排序的方式("ASC" 表示升序,"DESC" 表示降序)。</returns> public static String GetSortType(bool ascending) { return (ascending ? "ASC" : "DESC"); } /// <summary> /// 獲取一個(gè)布爾值,該值指示排序的方式是否為升序。 /// </summary> /// <param name="orderType">排序的方式("ASC" 表示升序,"DESC" 表示降序)。</param> /// <returns>"ASC"則為 true;"DESC"則為 false;其它的為 true。</returns> public static bool IsAscending(String orderType) { return ((orderType.ToUpper() == "DESC") ? false : true); } } } ?
總結(jié)
以上是生活随笔為你收集整理的DataGrid连接Access的快速分页法——动态生成SQL语句的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DataGrid连接Access的快速分
- 下一篇: 显示DataGrid序号的一个适用的方法