GridView自带的分页对于百万数据来说,效率太低,所以一般的项目应用AspNetPager分页控件调用存储过程会相当的高效,这里我们讲解下普通三层架构中如何使用AspNetPager分页控件进行数据分页。
1. Sql server 2000通用分页存储过程
CODE:
CREATE PROCEDURE UP_GetDataList
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere nvarchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL nvarchar(4000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0 --如果@doCount传递过来的不是0,就执行总数统计
begin
if @strWhere !=''
set @strSQL = 'SELECT COUNT(*) AS Total FROM ' + @tblName + ' WHERE ' + @strWhere
else
set @strSQL = 'SELECT COUNT(*) AS Total FROM ' + @tblName
end
else
begin
if @OrderType != 0
begin
set @strTmp = '<(SELECT MIN'
set @strOrder = ' ORDER BY [' + @fldName +'] DESC'
--如果@OrderType不是0,就执行降序
end
else
begin
set @strTmp = '>(SELECT MAX'
set @strOrder = ' ORDER BY [' + @fldName +'] ASC'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'SELECT TOP ' + str(@PageSize) +' '+@strGetFields+ ' FROM [' + @tblName + '] WHERE ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'SELECT TOP ' + str(@PageSize) +' '+@strGetFields+ ' FROM ['+ @tblName + '] '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'SELECT TOP ' + str(@PageSize) +' '+@strGetFields+ ' FROM ['
+ @tblName + '] WHERE [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) FROM (SELECT TOP ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] FROM [' + @tblName + ']' + @strOrder + ') AS tblTmp)'+ @strOrder
if @strWhere != ''
set @strSQL = 'SELECT TOP ' + str(@PageSize) +' '+@strGetFields+ ' FROM ['
+ @tblName + '] WHERE [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) FROM (SELECT TOP ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] FROM [' + @tblName + '] WHERE ' + @strWhere + ' '
+ @strOrder + ') AS tblTmp) AND ' + @strWhere + ' ' + @strOrder
end
end
exec (@strSQL)
GO
2.DAL层的分页代码:
CODE:
/// 分页获取数据列表
///
/// 每页数量
/// 当前页索引
/// 查询字符串
/// 设置排序类型, 非 0 值则降序
///
public DataSet GetList(int PageSize, int PageIndex, string strWhere, string OrderType)
{
SqlParameter[] parameters = {
new SqlParameter("@tblName", SqlDbType.VarChar, 255),
new SqlParameter("@fldName", SqlDbType.VarChar, 255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@IsReCount", SqlDbType.Bit),
new SqlParameter("@OrderType", SqlDbType.Bit),
new SqlParameter("@strWhere", SqlDbType.VarChar,1000),
};
parameters[0].Value = "Accounts_Users";
//2007.11.22 这里修改为按UserName排序
parameters[1].Value = "UserName";
parameters[2].Value = PageSize;
parameters[3].Value = PageIndex;
parameters[4].Value = 0;
parameters[5].Value = int.Parse(OrderType);
parameters[6].Value = strWhere;
return DbHelperSQL.RunProcedure("GetRecordFromPage", parameters, "ds");
}
3.BLL层的分页调用代码:
CODE:
/// 分页获得数据列表
///
/// 每页数量
/// 当前页索引
/// 查询字符串
/// 设置排序类型, 非 0 值则降序
///
public DataSet GetList(int PageSize, int PageIndex, string strWhere, string OrderType)
{
return dal.GetList(PageSize, PageIndex, strWhere, OrderType);
}
3.在页面上拖一个GridView控件,拖一个AspNetPager控件
如下:
CustomInfoHTML="共%RecordCount%条记录 Page %CurrentPageIndex% of %PageCount% Order %StartRecordIndex%-%EndRecordIndex%"
FirstPageText="首页" HorizontalAlign="Center" InputBoxStyle="19px" LastPageText="尾页"
meta:resourcekey="AspNetPager" NextPageText="后页" OnPageChanged="AspNetPager_PageChanged"
PageSize="10" PrevPageText="前页" ShowCustomInfoSection="Left" ShowInputBox="Always"
Style="font-size: 12px" Width="90%">
4、在cs文件中增加以下代码:
PageLoad事件中:
{
//确定数据数量
HDHG.BLL.Accounts.Accounts_Users blluser = new HDHG.BLL.Accounts.Accounts_Users();
this.AspNetPager.RecordCount = blluser.GetCount(strWhere);
BindGridView();
}
绑定数据函数
/// 绑定用户列表
///
private void BindGridView()
{
strWhere = this.lblStrWhere.Text;
HDHG.BLL.Accounts.Accounts_Users blluser = new HDHG.BLL.Accounts.Accounts_Users();
DataSet ds = blluser.GetList(this.AspNetPager.PageSize, this.AspNetPager.CurrentPageIndex, strWhere, "0");
this.myGridView.DataSource = ds;
this.myGridView.DataBind();
}
分页绑定数据:
/// 分页绑定数据
///
///
///
protected void AspNetPager_PageChanged(object sender, EventArgs e)
{
this.BindGridView();
}
这样就可以分页了
注:blluser.GetCount()是获取数据数量的方法
lblStrWhere是一个隐藏Label,保存查询条件。也可以不设置这个控件
DataList也可以用这种方法绑定,用熟了就会很方便