• 通用分页存储过程 + 自定义控件


    看到园子里的朋友发的一个通用分页存储过程,呵呵,正好把自己项目中的分页模块给大家分享一下

    如存在不足的地方,请大家多多指教!

    一.分页存储过程:

    代码
    CREATE   PROCEDURE [dbo].[PagingRecord]
        ( 
        
    @TableName varchar(100),--表名或视图表 
        @OrderField varchar(100),--排序字段及类型(多个条件用逗号分开)如:JobID DESC,Checkintime
        @PageSize int,--页尺寸
        @PageIndex int,--页号,从0开始
        @DoCount  AS bit=1 ,-- 0值返回记录总数, 非 0 值则返回记录
        @StrWhere varchar(2000),--条件 
        @FieldList varchar(2000)--欲选择字段列表      
        ) 
    AS 

    BEGIN TRAN

    DECLARE @SqlQuery varchar(4000)

    IF @DoCount<>0
        
    Goto GetCount
    Else
        
    Goto GetSearch



    GetCount:
    --返回记录总数
        DECLARE @SearchSql AS Nvarchar(4000)
        
    SET @SearchSql= 'SELECT Count(*) AS Total FROM '+@TableName+' WHERE '+@StrWhere
        
    exec sp_executesql @SearchSql
        
    print @SearchSql 
    COMMIT TRAN
        
    return

    GetSearch:

        
    SET @SqlQuery='SELECT '+@FieldList+'
        FROM (SELECT row_number() over(ORDER BY 
    '+@OrderField+') as rownum, 
                
    '+@FieldList+'
              FROM 
    '+@TableName+' WHERE '+@StrWhere +') as temp
        WHERE rownum BETWEEN (
    '+cast(@PageIndex as varchar)+'-1)*'+cast(@PageSize as varchar)+'+1 and '+cast(@PageIndex as varchar)+'*'+cast(@PageSize as varchar+ ' ORDER BY '+@OrderField
        
    -- print @SqlQuery
        SET NOCOUNT ON
        
    execute(@SqlQuery)
        
    SET NOCOUNT OFF


    COMMIT TRAN

    二.在程序中定义一个公用方法,具体放哪,自己把握吧

    代码
            /// <summary>
            
    /// 简单分页程序
            
    /// </summary>
            
    /// <param name="tblName">表名</param>
            
    /// <param name="orderEx">排序公式(如: SendTime desc , pkid asc)</param>
            
    /// <param name="pagesize">單頁大小</param>
            
    /// <param name="pageindex">頁碼</param>
            
    /// <param name="strWhere">查詢條件</param>
            
    /// <param name="feildlist">顯示的字段</param>
            
    /// <param name="recordCount">返回的記錄總數</param>
            
    /// <returns></returns>
            
    public static DataSet GetPagingRecord(string tblName, string orderEx, int pagesize, int pageindex, string strWhere, string feildlist, out int recordCount)
            {
                SqlParameter
    [] cmdParas ={
                                              new SqlParameter("
    @TableName",SqlDbType.VarChar,255),
                                              new SqlParameter("
    @OrderField",SqlDbType.VarChar,255),
                                              new SqlParameter("
    @PageSize",SqlDbType.Int,4),
                                              new SqlParameter("
    @PageIndex",SqlDbType.Int,4),
                                              new SqlParameter("
    @DoCount",SqlDbType.Bit,1),
                                              new SqlParameter("
    @StrWhere",SqlDbType.VarChar,2000),
                                              new SqlParameter("
    @FieldList",SqlDbType.VarChar,2000)
                                          };
                cmdParas
    [0].Value = tblName;
                cmdParas
    [1].Value = orderEx;
                cmdParas
    [2].Value = pagesize;
                cmdParas
    [3].Value = pageindex;
                cmdParas
    [4].Value = true;
                cmdParas
    [5].Value = strWhere;
                cmdParas
    [6].Value = feildlist;

                DataSet ds 
    = SqlBase.RunProcedure("PagingRecord", cmdParas, "table");
                recordCount 
    = ds.Tables[0].Rows.Count > 0 ? Int32.Parse(ds.Tables[0].Rows[0][0].ToString()) : 0;

                SqlParameter
    [] cloneParas = new SqlParameter[cmdParas.Length];
                
    for (int i = 0, j = cmdParas.Length; i < j; i++)
                {
                    cloneParas
    [i] = (SqlParameter)((ICloneable)cmdParas[i]).Clone();
                }

                cloneParas
    [4].Value = false;
                
    return SqlBase.RunProcedure("PagingRecord", cloneParas, "table");
            }

            
    /// <summary>
            
    /// 简单分页程序
            
    /// </summary>
            
    /// <param name="tblName">表名</param>
            
    /// <param name="orderEx">排序公式(如: SendTime desc , pkid asc)</param>
            
    /// <param name="pagesize">單頁大小</param>
            
    /// <param name="pageindex">頁碼</param>
            
    /// <param name="strWhere">查詢條件</param>
            
    /// <param name="feildlist">顯示的字段</param>
            
    /// <returns></returns>
            
    public static DataSet GetPagingRecord(string tblName, string orderEx, int pagesize, int pageindex, string strWhere, string feildlist)
            {
                SqlParameter
    [] cmdParas ={
                                              new SqlParameter("
    @TableName",SqlDbType.VarChar,255),
                                              new SqlParameter("
    @OrderField",SqlDbType.VarChar,255),
                                              new SqlParameter("
    @PageSize",SqlDbType.Int,4),
                                              new SqlParameter("
    @PageIndex",SqlDbType.Int,4),
                                              new SqlParameter("
    @DoCount",SqlDbType.Bit,1),
                                              new SqlParameter("
    @StrWhere",SqlDbType.VarChar,2000),
                                              new SqlParameter("
    @FieldList",SqlDbType.VarChar,2000)
                                          };
                cmdParas
    [0].Value = tblName;
                cmdParas
    [1].Value = orderEx;
                cmdParas
    [2].Value = pagesize;
                cmdParas
    [3].Value = pageindex;
                cmdParas
    [4].Value = false;
                cmdParas
    [5].Value = strWhere;
                cmdParas
    [6].Value = feildlist;

                
    return SqlBase.RunProcedure("PagingRecord", cmdParas, "table");
            }

    三.自定义控件 Pager.cs

    代码
     [ToolboxData("<{0}:Pager runat=server></{0}:Pager>")]
        
    public class Pager : CompositeControl, INamingContainer
        {
            
    #region 公共屬性
            [Browsable(
    true), DefaultValue("0"), Localizable(true), Category("分頁"), Description("當前頁碼")]
            
    public int PageIndex
            {
                
    get
                {
                    
    return ViewState["PageIndex"== null ? 0 : Int32.Parse(ViewState["PageIndex"].ToString());
                }
                
    set
                {
                    ViewState[
    "PageIndex"= value;
                }
            }

            [Browsable(
    true), DefaultValue("10"), Localizable(true), Category("分頁"), Description("每頁顯示的行數")]
            
    public int PageSize
            {
                
    get
                {
                    
    return ViewState["PageSize"== null ? 10 : Int32.Parse(ViewState["PageSize"].ToString());
                }
                
    set
                {
                    ViewState[
    "PageSize"= value;
                }
            }

            [Browsable(
    true), DefaultValue("0"), Localizable(true), Category("數據"), Description("數據源中的總記錄數")]
            
    public int RecordCount
            {
                
    get
                {
                    
    return ViewState["RecordCount"== null ? 0 : Int32.Parse(ViewState["RecordCount"].ToString());
                }
                
    set
                {
                    ViewState[
    "RecordCount"= value;
                }
            }

            [Browsable(
    true), Category("分页"), PersistenceMode(PersistenceMode.InnerProperty), Description("控制与控件关联的分页UI设置"),
            DesignerSerializationVisibility(DesignerSerializationVisibility.Content), NotifyParentProperty(
    true)]
            
    public PagerSettings PagerSetttings
            {
                
    get
                {
                    
    if (this._pagerSettings == null)
                        
    this._pagerSettings = new PagerSettings();
                    
    return this._pagerSettings;
                }
            }
            
    #endregion

            
    #region 私有屬性
            
    private int PageCount
            {
                
    get
                {
                    
    if (this.RecordCount == 0 || this.PageSize == 0)
                        
    return 0;
                    
    return (int)Math.Ceiling(this.RecordCount / (this.PageSize * 1.0));
                }
            }
            
    #endregion

            
    #region 私有變量
            
    private static readonly object EventPageIndexChanged = new object();
            
    private PagerSettings _pagerSettings = new PagerSettings();
            
    private LinkButton _lbtnFirst = new LinkButton();
            
    private LinkButton _lbtnPre = new LinkButton();
            
    private LinkButton _lbtnNext = new LinkButton();
            
    private LinkButton _lbtnLast = new LinkButton();
            
    private TextBox txtPageIndex = new TextBox();
            
    #endregion

            
    #region 事件相關
            [Description(
    "Pager_OnPageIndexChanged"), Category("事件")]
            
    public event EventHandler PageIndexChanged
            {
                add
                {
                    
    base.Events.AddHandler(EventPageIndexChanged, value);
                }
                remove
                {
                    
    base.Events.RemoveHandler(EventPageIndexChanged, value);
                }
            }

            
    protected void OnPageChanged(EventArgs e)
            {
                EventHandler handler 
    = (EventHandler)Events[EventPageIndexChanged];
                
    if (handler != null)
                    handler(
    this, e);
            }
            
    #endregion

            
    #region 重寫基類
            
    protected override void CreateChildControls()
            {
                
    this.Controls.Clear();

                
    this._lbtnFirst.Text = "首頁";
                
    this._lbtnFirst.CommandName = "First";
                
    this._lbtnFirst.CausesValidation = false;
                
    this._lbtnFirst.Click += new EventHandler(LinkButton_Click);

                
    this._lbtnPre.Text = "上一頁";
                
    this._lbtnPre.CommandName = "Prev";
                
    this._lbtnPre.CausesValidation = false;
                
    this._lbtnPre.Click += new EventHandler(LinkButton_Click);

                
    this._lbtnNext.Text = "下一頁";
                
    this._lbtnNext.CommandName = "Next";
                
    this._lbtnNext.CausesValidation = false;
                
    this._lbtnNext.Click += new EventHandler(LinkButton_Click);

                
    this._lbtnLast.Text = "未頁";
                
    this._lbtnLast.CommandName = "Last";
                
    this._lbtnLast.CausesValidation = false;
                
    this._lbtnLast.Click += new EventHandler(LinkButton_Click);

                
    this.txtPageIndex.Width = 20;
                
    this.txtPageIndex.AutoPostBack = true;
                
    this.txtPageIndex.TextChanged += new EventHandler(txtPageIndex_TextChanged);

                
    this.Controls.Add(this._lbtnFirst);
                
    this.Controls.Add(this._lbtnLast);
                
    this.Controls.Add(txtPageIndex);
                
    this.Controls.Add(this._lbtnNext);
                
    this.Controls.Add(this._lbtnPre);
                
    base.CreateChildControls();
            }

            
    protected override void Render(HtmlTextWriter writer)
            {
                
    //如果只有一頁,則不顯示分頁控件
                
    //if (this.PageCount == 1)
                
    //    return;
                if (this.CssClass != "")
                    writer.Write(
    "<div class=\"{0}\">"this.CssClass);
                
    else
                    writer.Write(
    "<div>");
                
    //如果沒有數據
                if (this.RecordCount == 0)
                {
                    writer.Write(
    "對不起,沒有查詢到相關記錄!</div>");
                    
    return;
                }
                writer.Write(
    "<table align=\"right\"><tr><td>總記錄:<span style=\"color:red\">{0}</span>條,每頁<span>{1}</span>條,當前頁:<span style=\"color:red\">{2}</span>/<span>{3}</span></td>",
                    
    this.RecordCount, this.PageSize.ToString(), this.PageIndex + 1this.PageCount);

                
    #region 顯示首頁,上一頁
                writer.Write(
    "<td>");
                
    if (this.PageIndex == 0 || this.PageCount == 1)
                {
                    
    this._lbtnFirst.Visible = false;
                    
    this._lbtnPre.Visible = false;
                }
                
    this._lbtnFirst.RenderControl(writer);
                writer.Write(
    "</td><td>");
                
    this._lbtnPre.RenderControl(writer);
                writer.Write(
    "</td>");

                
    #endregion

                
    #region 顯示下一頁,未頁
                writer.Write(
    "<td>");
                
    if (this.PageIndex == this.PageCount - 1 || this.PageCount == 1)
                {
                    
    this._lbtnNext.Visible = false;
                    
    this._lbtnLast.Visible = false;
                }
                
    this._lbtnNext.RenderControl(writer);
                writer.Write(
    "</td><td>");
                
    this._lbtnLast.RenderControl(writer);
                writer.Write(
    "</td>");
                
    #endregion

                
    #region 跳轉至
                writer.Write(
    "<td>跳轉至</td><td style=\"20px\">");
                txtPageIndex.RenderControl(writer);
                writer.Write(
    "</td></tr></table></div>");
                
    #endregion

            }
            
    #endregion

            
    #region 子控件的事件
            
    void LinkButton_Click(object sender, EventArgs e)
            {
                
    string commandName = (sender as LinkButton).CommandName;
                
    switch (commandName)
                {
                    
    case "First": PageIndex = 0break;
                    
    case "Next": PageIndex++break;
                    
    case "Prev": PageIndex--break;
                    
    case "Last": PageIndex = PageCount - 1break;
                }
                OnPageChanged(e);
            }

            
    void txtPageIndex_TextChanged(object sender, EventArgs e)
            {
                
    if (txtPageIndex.Text.Trim().Length == 0)
                    
    return;
                
    int pageIndex = 0;
                
    if (int.TryParse(txtPageIndex.Text, out pageIndex))
                {
                    pageIndex
    --;
                    
    if (pageIndex < 1)
                        
    this.PageIndex = 0;
                    
    else if (pageIndex > PageCount)
                        
    this.PageIndex = PageCount - 1;
                    
    else
                        
    this.PageIndex = pageIndex;
                }
                OnPageChanged(e);
            }
            
    #endregion

    四.调用代码段

    代码
     void BindRpt()
            {
                
    int i = 0;
                rptInfo.DataSource 
    = DataAccess.Common.GetPagingRecord("Orders""AuditingTime DESC", Pager1.PageSize, Pager1.PageIndex + 1,
                    StrWhere, 
    "*"out i);
            // StrWhere 查询条件,可以在基类PageBase中写一个属性,然后继承PageBase,用ViewState保存查询条件
            // 当进行多条件查询时,只需要对StrWhere赋予不同的值,然后执行BindRpt()方法即可
            // 给StrWhere赋值时,需要注意SQL注入攻击!
                rptInfo.DataBind();
                Pager1.RecordCount 
    = i;
            }

            
    protected void Pager1_PageIndexChanged(object sender, EventArgs e)
            {
                BindRpt();
            }
  • 相关阅读:
    设置共享文件夹大小
    About IConfigurationSectionHandler Interface
    zoj 1050
    SQL Server 数据库优化经验总结
    一、页面输出缓存
    [转]深入解读 ADO.NET 2.0 的十大最新特性
    ASP.NET 缓存学习
    [转]写给ASP.NET程序员:网站中的安全问题
    [转] ASP.NET 性能提升秘诀之管道与进程优化
    实战 SQL Server 2005 镜像配置
  • 原文地址:https://www.cnblogs.com/tangself/p/1621168.html
Copyright © 2020-2023  润新知