数据分页对象--不用再为数据分页问题而头痛罗,太好了
作者/天才 时间/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;
}
}
}
}
查看该用户更多文章>>