| 数据分页对象--不用再为数据分页问题而头痛罗,太好了 |
| 作者/天才 时间/2006-1-10 17:21:00 类别/开发技术 查看/ |
| 标签:.Net联盟 |
作者:黄润成![]() ADO.Net为我们提供了数据分页的功能,但使用的是DataSet来实现,效率不是很好,而且不能记录和管理当前页码、总页码、记录数等信息,还要我们自己处理,太烦了。 那有什么办法改善呢?我对XXXDataReader对象进行了封装,自己实现了一个数据分页类,可以实现数据分页获取,并自动记录分页的状态信息。 下面只列出代码,说明还没有写出来,大家将就着看吧,如果对大家有一点点帮助,就是我最大的荣幸。 (注意,些类需要用到《自己编写的数据访问类(C#)》中定义的数据访问类。) using System; using System.Data; using it.com.cn.DbServices; using System.Windows.Forms; namespace it.com.cn.DbServices.SqlDbServices { /// <summary> /// 数据分页。返回 DataSet 对象,或直接将数据绑定到控件。提供表态方法,并自动保存实例到页面的 Session 中。 /// </summary> public class DataSetPagination { #region 私有变量 private int FPageSize; private int FTotalRowsCount; private int FCurrentPageNo; private int FTotalPagesCount; private string FSqlString; private DbParams FParams; private bool FFirstEnabled = false, FPreviousEnabled = false, FNextEnabled = true, FLastEnabled = true; private string FSqlForCount; #endregion #region 属性 public int PageSize { get { return FPageSize; } set { FPageSize = value; if ((FTotalRowsCount % FPageSize) == 0) { FTotalPagesCount = (FTotalRowsCount % FPageSize); } else { FTotalPagesCount = (FTotalRowsCount % FPageSize) + 1; } } } public DbParams Params { get { return FParams; } set { FParams = value; } } public int TotalRowsCount { get { return FTotalRowsCount; } } public int CurrentPageNo { get { return FCurrentPageNo; } } public int TotalPagesCount { get { return FTotalPagesCount; } } public bool FirstEnabled { get { return FFirstEnabled; } } public bool PreviousEnabled { get { return FPreviousEnabled; } } public bool NextEnabled { get { return FNextEnabled; } } public bool LastEnabled { get { return FLastEnabled; } } #endregion /// <summary> /// 创建一个数据分页管理对象。 /// </summary> /// <param name="page">关联页面。</param> /// <param name="SqlString">查询数据SQL</param> /// <param name="PageSize">每页的数据记录条数。</param> public static DataSetPagination CreateEntity(string SqlString, int PageSize) { return new DataSetPagination(SqlString, new DbParams(), PageSize); } /// <summary> /// 创建一个数据分页管理对象。 /// </summary> /// <param name="page">关联页面。</param> /// <param name="SqlString">查询数据SQL</param> /// <param name="Params">查询参数对象数组。</param> /// <param name="PageSize">每页的数据记录条数。</param> public static DataSetPagination CreateEntity(string SqlString, DbParams Params, int PageSize) { return new DataSetPagination(SqlString, Params, PageSize); } private DataSetPagination(string SqlString, DbParams Params, int PageSize) { FParams = Params; FPageSize = PageSize; SetSqlString(SqlString); } public void SetSqlString(string SqlString) { FCurrentPageNo = 0; FSqlString = SqlString; FSqlForCount = "SELECT COUNT(*) AS RowsCount FROM (" + FSqlString + ") DERIVEDTBL"; RefreshCountInfo(); } public void RefreshCountInfo() { FTotalRowsCount = (int) DbService.ExecuteScalar(FSqlForCount, FParams); if ((FTotalRowsCount % FPageSize) == 0) { FTotalPagesCount = (FTotalRowsCount / FPageSize); } else { FTotalPagesCount = (FTotalRowsCount / FPageSize) + 1; } } public DataSet FirstPage() { FCurrentPageNo = 1; SetButtonStatus(); return DbService.ExecuteDataSet(FSqlString, FParams, 0, FPageSize); } public DataSet PreviousPage() { if (FCurrentPageNo > 1) FCurrentPageNo--; SetButtonStatus(); return DbService.ExecuteDataSet(FSqlString, FParams, FPageSize * (FCurrentPageNo - 1), FPageSize); } public DataSet NextPage() { if (FCurrentPageNo < FTotalPagesCount) FCurrentPageNo++; SetButtonStatus(); return DbService.ExecuteDataSet(FSqlString, FParams, FPageSize * (FCurrentPageNo -1), FPageSize); } public DataSet LastPage() { FCurrentPageNo = FTotalPagesCount; SetButtonStatus(); return DbService.ExecuteDataSet(FSqlString, FParams, FPageSize * (FCurrentPageNo - 1), FPageSize); } public DataSet GotoPage(int PageNo) { if (PageNo < 1) { FCurrentPageNo = 1; } else if (PageNo > FTotalPagesCount) { FCurrentPageNo = FTotalPagesCount; } else { FCurrentPageNo = PageNo; } SetButtonStatus(); return DbService.ExecuteDataSet(FSqlString, FParams, FPageSize * (FCurrentPageNo - 1), FPageSize); } private void SetButtonStatus() { if (FTotalPagesCount == 1 || FTotalPagesCount == 0) { FFirstEnabled = false; FPreviousEnabled = false; FNextEnabled = false; FLastEnabled = false; } else if (FCurrentPageNo == 1) { FFirstEnabled = false; FPreviousEnabled = false; FNextEnabled = true; FLastEnabled = true; } else if (FCurrentPageNo == FTotalPagesCount) { FFirstEnabled = true; FPreviousEnabled = true; FNextEnabled = false; FLastEnabled = false; } else { FFirstEnabled = true; FPreviousEnabled = true; FNextEnabled = true; FLastEnabled = true; } } } /// <summary> /// 数据分页。返回 IDataReaderWrapper 实例对象,或直接将数据绑定到控件。提供表态方法,并自动保存实例到页面的 Session 中。 /// </summary> public class ReaderPagination { #region 私有变量 private int FPageSize; private int FTotalRowsCount; private int FCurrentPageNo; private int FTotalPagesCount; private string FSqlString; private DbParams FParams; private bool FFirstEnabled = false, FPreviousEnabled = false, FNextEnabled = true, FLastEnabled = true; private string FSqlForCount; #endregion #region 属性 public int PageSize { get { return FPageSize; } set { FPageSize = value; if ((FTotalRowsCount % FPageSize) == 0) { FTotalPagesCount = (FTotalRowsCount % FPageSize); } else { FTotalPagesCount = (FTotalRowsCount % FPageSize) + 1; } } } public DbParams Params { get { return FParams; } set { FParams = value; } } public int TotalRowsCount { get { return FTotalRowsCount; } } public int CurrentPageNo { get { return FCurrentPageNo; } set { FCurrentPageNo = value; } } public int TotalPagesCount { get { return FTotalPagesCount; } } public bool FirstEnabled { get { return FFirstEnabled; } } public bool PreviousEnabled { get { return FPreviousEnabled; } } public bool NextEnabled { get { return FNextEnabled; } } public bool LastEnabled { get { return FLastEnabled; } } #endregion /// <summary> /// 创建一个数据分页管理对象。 /// </summary> /// <param name="page">关联页面。</param> /// <param name="SqlString">查询语句</param> /// <param name="KeyField">关键字段。</param> /// <param name="PageSize">每页的数据记录条数。</param> public static ReaderPagination CreateEntity(string SqlString, string KeyField, int PageSize) { return new ReaderPagination(SqlString, KeyField, new DbParams(), PageSize); } /// <summary> /// 创建一个数据分页管理对象。 /// </summary> /// <param name="page">关联页面。</param> /// <param name="SqlString">查询语句</param> /// <param name="KeyField">关键字段。</param> /// <param name="Params">查询参数对象数组。</param> /// <param name="PageSize">每页的数据记录条数。</param> public static ReaderPagination CreateEntity(string SqlString, string KeyField, DbParams Params, int PageSize) { return new ReaderPagination(SqlString, KeyField, Params, PageSize); } private ReaderPagination(string SqlString, string KeyField, DbParams Params, int PageSize) { FParams = Params; FPageSize = PageSize; SetSqlString(SqlString, KeyField); } /// <summary> /// 重新设置 FSqlString 。 /// </summary> /// <param name="SqlString">新 SqlString </param> /// <param name="KeyField">关键字段。</param> public void SetSqlString(string SqlString, string KeyField) { FCurrentPageNo = 0; string tmpSql = ""; int iSelect = SqlString.ToUpper().IndexOf("SELECT "); int iDistinct = SqlString.ToUpper().IndexOf(" DISTINCT "); int iTop = SqlString.ToUpper().IndexOf(" TOP "); if ((iDistinct > -1) && (SqlString.Substring(iSelect + 6, iDistinct - iSelect - 5).Trim() == "")) { if (!((iTop > -1) && (SqlString.Substring(iDistinct + 10, iTop - iDistinct - 9).Trim() == ""))) { tmpSql = "SELECT DISTINCT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf(" DISTINCT ") + 10); } else { tmpSql = SqlString; } } else { if (!((iTop > -1) && (SqlString.Substring(iSelect + 6, iTop - iSelect - 5).Trim() == ""))) { tmpSql = "SELECT TOP 100 PERCENT " + SqlString.ToUpper().Substring(SqlString.ToUpper().IndexOf("SELECT ") + 7); } else { tmpSql = SqlString; } } FSqlString = "SELECT TOP @@PageSize * FROM (" + tmpSql + ") DERIVEDTBL1 WHERE " + KeyField + " NOT IN ( SELECT TOP @@CurrentRows " + KeyField + " FROM (" + tmpSql + " ) DERIVEDTBL2 ) "; FSqlForCount = "SELECT COUNT(*) AS RowsCount FROM (" + tmpSql + ") DERIVEDTBL"; RefreshCountInfo(); } //因为在创建对象时要调用该方法,所以不能做成静态,否则用 GetEntity 来取得对象时对象尚未创建,产生异常。 public void RefreshCountInfo() { FTotalRowsCount = (int) DbService.ExecuteScalar(FSqlForCount, FParams); if ((FTotalRowsCount % FPageSize) == 0) { FTotalPagesCount = (FTotalRowsCount / FPageSize); } else { FTotalPagesCount = (FTotalRowsCount / FPageSize) + 1; } } public IDataReaderWrapper FirstPage() { FCurrentPageNo = 1; SetButtonStatus(); string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString()); SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (FCurrentPageNo - 1)).ToString()); return DbService.ExecuteReader(SqlString, FParams); } public IDataReaderWrapper PreviousPage() { if (FCurrentPageNo > 1) FCurrentPageNo--; SetButtonStatus(); string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString()); SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (FCurrentPageNo - 1)).ToString()); return DbService.ExecuteReader(SqlString, FParams); } public IDataReaderWrapper NextPage() { if (FCurrentPageNo < FTotalPagesCount) FCurrentPageNo++; SetButtonStatus(); string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString()); SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (FCurrentPageNo - 1)).ToString()); return DbService.ExecuteReader(SqlString, FParams); } public IDataReaderWrapper LastPage() { FCurrentPageNo = FTotalPagesCount; SetButtonStatus(); string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString()); SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (FCurrentPageNo - 1)).ToString()); return DbService.ExecuteReader(SqlString, FParams); } public IDataReaderWrapper GotoPage(int PageNo) { if (PageNo < 1) { FCurrentPageNo = 1; } else if (PageNo > FTotalPagesCount) { FCurrentPageNo = FTotalPagesCount; } else { FCurrentPageNo = PageNo; } SetButtonStatus(); string SqlString = FSqlString.Replace("@@PageSize", PageSize.ToString()); SqlString = SqlString.Replace("@@CurrentRows", (PageSize * (FCurrentPageNo - 1)).ToString()); return DbService.ExecuteReader(SqlString, FParams); } private void SetButtonStatus() { if (FTotalPagesCount == 1 || FTotalPagesCount == 0) { FFirstEnabled = false; FPreviousEnabled = false; FNextEnabled = false; FLastEnabled = false; } else if (FCurrentPageNo == 1) { FFirstEnabled = false; FPreviousEnabled = false; FNextEnabled = true; FLastEnabled = true; } else if (FCurrentPageNo == FTotalPagesCount) { FFirstEnabled = true; FPreviousEnabled = true; FNextEnabled = false; FLastEnabled = false; } else { FFirstEnabled = true; FPreviousEnabled = true; FNextEnabled = true; FLastEnabled = true; } } } } |
| 查看该用户更多文章>> |
