zoukankan      html  css  js  c++  java
  • 3层架构应用AspNetPager分页 GridView分页 Fred

    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控件
    如下:
    CODE:
    <webdiyer:AspNetPager id=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事件中:

    CODE:
    if (!this.IsPostBack)
    {
    //确定数据数量
    HDHG.BLL.Accounts.Accounts_Users blluser = new HDHG.BLL.Accounts.Accounts_Users();
    this.AspNetPager.RecordCount = blluser.GetCount(strWhere);
    BindGridView();
    }



    绑定数据函数

    CODE:
    ///
    /// 绑定用户列表
    ///
    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();
    }



    分页绑定数据:

    CODE:
    ///
    /// 分页绑定数据
    ///
    ///
    ///
    protected void AspNetPager_PageChanged(object sender, EventArgs e)
    {
    this.BindGridView();
    }



    这样就可以分页了

    注:blluser.GetCount()是获取数据数量的方法
    lblStrWhere是一个隐藏Label,保存查询条件。也可以不设置这个控件
    DataList也可以用这种方法绑定,用熟了就会很方便

  • 相关阅读:
    空间换时间之反范式设计之路/合理冗余/去除外键
    WebAPI接口设计:SwaggerUI文档 / 统一响应格式 / 统一异常处理 / 统一权限验证
    开放api接口签名验证
    EasyUI开发踩过的坑(EasyUI开发笔记)
    nuget挂了吗?
    C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)
    从应用的角度讲创业公司该如何选择域名?
    疑似easyui本身bug:easyui时间控件问题,试了几个版本都不行
    工作三年对程序的理解特来求证
    控制器读取视图表单中的数据的几种方式
  • 原文地址:https://www.cnblogs.com/Fred_Xu/p/1446760.html
Copyright © 2011-2022 走看看