我使用了AspNetPager控件。
虽然已经可以分页了,但是我是用select * 这样的SQL语句实现的。
这样的话,记录多了就动不了了。
那我该怎么写呢?写存储过程吗?还是怎样?
我用的是asp.net+oracle。。

解决方案 »

  1.   

    检查你的代码。
    然后,建立索引,使用存储过程,不使用*,只查询需要字段 等 这些都可以起到一定的优化作用。AspNetPager具体使用参见其官方网站:www.webdiyer.comPS:个人使用oracle经验感觉,oracle想用好,还是要花点时间研究。 尤其在性能提升方便。
      

  2.   

    用select top 每页显示几条 from table where id not in ( select  (当前第几页-1)*每页显示几条 id from table order by id desc) order by id desc oracle的存储过程没用过,和SQL差不多吧。原理这样就好了。
      

  3.   

    那我怎么根据AspNetPager用存储过程呀.
      

  4.   

    select * 这样的语句尽量少用,不要因为图省事,特别是有text image 这类的大数据存在的时候,使用select * 查询会使性能下降的很厉害
      

  5.   


    存储过程中设定一些Out参数(执行存储过程时用ref,就可以得到),作为AspNetPager的设定参数就可以了。
      

  6.   


    经典 这样效率比较高用select top 每页显示几条 from table where id not in ( select  (当前第几页-1)*每页显示几条 id from table order by id desc) order by id desc
      

  7.   

    用select top 每页显示几条 from table where id not in ( select TOP (当前第几页-1)*每页显示几条 id from table order by id desc) order by id desc
    看好这个貌似后面少了个top
      

  8.   

    http://topic.csdn.net/u/20091126/17/0CE88E18-D4A6-44CE-9450-613CDAB5BEF1.html
      

  9.   

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ALTER proc [dbo].[EmpPage]
    @pagesize int,
    @currentpageIndex int
    as 
      declare @sql nvarchar(500)
      set @sql=' select Top '+ convert(varchar(10),@pagesize)+
               ' * from NewsInfo where NewsId not in (select Top '+
                 convert(varchar(10),(@currentpageIndex-1) * @pagesize)+
               ' NewsId from NewsInfo order by NewsId ASC) order by NewsId ASC '
    exec sp_executesql @sql
      

  10.   

    楼主到我的主页 http://www.webdiyer.com 下载一个示例项目看一下,用不用分页存储过程和AspNetPager没有任何关系,因为分页控件只是显示一系列的导航按钮,数据怎么获取和显示安全是开发人员的事,用AspNetPager关键在于两点:1、获取要分页的总记录数并将其值赋给RecordCount属性;2、编写PageChanged事件处理程序,一般在该事件处理程序中根据事件中的参数获取并显示当前页的数据。尤其注意第二条,只获取和显示当前页的数据,这些数据在你的问题中,当然用存储过程获取最好了。===================================================
    ASP.NET WebForm和ASP.NET MVC分页最终解决之道
      

  11.   


    楼主我告诉你个秘密
    17楼就是AspNetPager的作者,听他的不会错!
      

  12.   


    如果你用sql server,可以用我这个工具生成分页存储过程 http://www.webdiyer.com/Products/AspNetPager/SpGenerator ,oracle已经好几年没用了,忘了怎么写分页存储过程的了,网上搜一下,应该有别人发过的。
      

  13.   

    我用的是oracle的..不用存储过程也可以的说,用ROWNUM..我主要是觉得如果数据量大了,怎么办.
      

  14.   


    这要在数据库优化方面想办法,用存储过程及分表保存数据等,oracle很早就支持分表了,不过几十万数据量的话一个表也慢不了多少,我操作过一百万的,稍微慢了些,但能应付,内部网用。===================================================
    ASP.NET WebForm和ASP.NET MVC分页最终解决之道
      

  15.   

    不会用存储过程也可以把所有数据都取出后用PagedDataSource进行分页,但如果数据多的话这样的效率非常低,所以建议还是用存储过程只获取当前页的数据,不会用可以学啊,不学永远不会的。===================================================
    ASP.NET WebForm和ASP.NET MVC分页最终解决之道
      

  16.   

    AspNetPager 要配合存储过程使用
    用vs自带的objectdatasource 试试
      

  17.   


    http://www.webdiyer.com/ 我的主页有
      

  18.   

    --把传入的sql 语句进行分页显示 可以排序
    ALTER proc  PageprocBySql]
    (
    @strSQL varchar(max),
    @pageIndex int, --当前页索引
    @pagesize int, --每页显示的行数
    @paixu varchar(50), --排序
    @pagecount int output, --总行数
    @id varchar(20) --标识列(自动增长)名称
    )
    as 
    --获取总行数
    declare @zonghang int;
    declare @getcountsql nvarchar(max)
    set @getcountsql='select @a=count(*) from ('+@strSQL+') as aa' 
    exec sp_executesql @getcountsql,N'@a int output',@zonghang output --把执行的结果赋给变量@zonghangdeclare @SQL nvarchar(max)
    begin
    if @pageIndex!=0
    begin
    if(@paixu!='')
    begin
    set @SQL='select * from  (select top '+convert(varchar,@pagesize)+' * from (select * from ('+@strSQL+') as cc where  '+@id+' > (select max( '+@id+' ) from (select top '+Convert(varchar,@pagesize*@pageIndex)+'  '+@id+'  from ('+@strSQL+') as aa order by  '+@id+'  asc ) as bb)) as ee order by  '+@id+'  asc) as vv order by '+@paixu+' desc';
    print @sql
    end
    else
    begin
    set @SQL='select top '+convert(varchar,@pagesize)+' * from (select * from ('+@strSQL+') as cc where '+@id+'> (select max( '+@id+' ) from (select top '+Convert(varchar,@pagesize*@pageIndex)+'  '+@id+'  from ('+@strSQL+') as aa order by  '+@id+'  asc ) as bb)) as ee';
    end
    end
    else
    begin
    if(@paixu!='')
    begin
    set @SQL='select top '+convert(varchar,@pagesize)+' * from  (select top '+convert(varchar,@pagesize)+' * from ('+@strSQL+') as aa order by '+@id+' asc) as bb order by '+@paixu+' desc';
    print @sql
    end
    else
    begin
    set @SQL='select top '+convert(varchar,@pagesize)+' * from ('+@strSQL+') as aa ';
    end
    end 
    exec sp_executesql @SQL
    end
    begin
    if @zonghang%@pagesize!=0 
    begin
    set @pagecount=(@zonghang/@pagesize)+1;
    end
    else
    begin
    set @pagecount=@zonghang/@pagesize;
    end
    end[/code]如果是oracle  把那个按照编号排序 改成 rownum  就可以了
      

  19.   

    我现在有个问题啊,我现在用 ROWNUM 进行分页的.
    WHERE RN BETWEEN " + a + " AND " + b + "
    a,b的值变化是这样的:   1,20    21,40   41,60这样改变的。
    (RN 是ROWNUM的伪列)
    就是1到20的记录在第一页会显示的。点下一页的时候就没有记录了。这是为什么啊?
      

  20.   

    我现在有个问题啊,我现在用 ROWNUM 进行分页的.
    WHERE RN BETWEEN " + a + " AND " + b + "
    a,b的值变化是这样的:  1,20    21,40  41,60这样改变的。
    (RN 是ROWNUM的伪列)
    就是1到20的记录在第一页会显示的。点下一页的时候就没有记录了。这是为什么啊?有人
    帮我看看这个问题撒
      

  21.   

    我现在有个问题啊,我现在用 ROWNUM 进行分页的. 
    WHERE RN BETWEEN " + a + " AND " + b + " 
    a,b的值变化是这样的:  1,20    21,40  41,60这样改变的。 
    (RN 是ROWNUM的伪列) 
    就是1到20的记录在第一页会显示的。点下一页的时候就没有记录了。这是为什么啊? 有人 
    帮我看看这个问题撒 
      

  22.   


    //绑定数据的部分
    public void BindData()
        {
            string bloodID = "";
            string patientID = "";
            string name = "";
            string liquid_num = "";
            string rack_num = "";
            string box_num = "";
            int firstPage = AspNetPager1.PageSize * (AspNetPager1.CurrentPageIndex - 1);
            int pageSize = AspNetPager1.PageSize;
            int a = AspNetPager1.PageSize * (AspNetPager1.CurrentPageIndex - 1) + 1;
            int b = AspNetPager1.PageSize * (AspNetPager1.CurrentPageIndex);        DataSet ds = cbb.SearchChaBlood(bloodID, patientID, name, liquid_num, rack_num, box_num, firstPage, pageSize, a, b);
            if (ds != null && ds.Tables[0].Rows.Count != 0)
            {
                this.gvBlood.DataSource = ds.Tables[0].DefaultView;
                this.gvBlood.DataBind();
            }
            try
            {
                if (ds.Tables[0].Rows.Count == 0)
                {
                    ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
                    gvBlood.DataSource = ds;
                    gvBlood.DataBind();
                    int columnCount = gvBlood.Rows[0].Cells.Count;
                    gvBlood.Rows[0].Cells.Clear();
                    gvBlood.Rows[0].Cells.Add(new TableCell());
                    gvBlood.Rows[0].Cells[0].ColumnSpan = columnCount;
                    gvBlood.Rows[0].Cells[0].Text = "没 有 记 录";
                    gvBlood.Rows[0].Cells[0].Height = 30;
                    gvBlood.Rows[0].Cells[0].HorizontalAlign = HorizontalAlign.Center;
                    //gvBlood.Rows[0].Cells[0].ForeColor = System.Drawing.Color.Blue;
                    //gvBlood.Rows[0].Cells[0].BackColor = System.Drawing.Color.FromName("#fff");
                }
            }
            catch (Exception ex)
            {
            }
            //动态设置用户自定义文本内容    
            AspNetPager1.CustomInfoHTML = "记录总数:<font color=\"blue\"><b>" + AspNetPager1.RecordCount.ToString() + "</b></font>&nbsp;";
            AspNetPager1.CustomInfoHTML += " 总页数:<font color=\"blue\"><b>" + AspNetPager1.PageCount.ToString() + "</b></font>&nbsp;";
            AspNetPager1.CustomInfoHTML += " 当前页:<font color=\"red\"><b>" + AspNetPager1.CurrentPageIndex.ToString() + "</b></font>";
        }//SQL语句部分
    public DataSet SearchChaBlood(string bloodId, string patientId, string name, string div_id, string rack_id, string box_id, int firstPage, int pageSize, int a, int b)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("SELECT     RN,BLOODID,PATIENTID,PATIENT_NAME,LESION_ORGAN,");
                sb.Append("           BLOOD_PERSON,BLOOD_DATE,DIV_ID,RACK_ID,");
                sb.Append("           BOX_ID,SAMPLE_XY,INBOUND_DATE, ");
                sb.Append("           INBOUND_HANDLER,OUTBOUND_DATE, OUTBOUND_HANDLER,");
                sb.Append("           EDIT_TIMES,LASTEDIT_DATE,LASTEDIT_HANDLER,STATE,");
                sb.Append("           DELETE_HANDLER,DELETE_DATE ");
                //sb.Append("FROM       CTL_CHA_BLOOD, CTL_PATIENT_MESSAGE ");
                sb.Append("FROM      (SELECT ROWNUM RN , CCB.* FROM ");
                sb.Append("          (SELECT    CTL_CHA_BLOOD.*,CTL_PATIENT_MESSAGE.NAME AS PATIENT_NAME ");
                sb.Append("           FROM CTL_CHA_BLOOD,CTL_PATIENT_MESSAGE ");
                sb.Append("           WHERE      CTL_CHA_BLOOD.PATIENTID = CTL_PATIENT_MESSAGE.PATIENTID AND CTL_CHA_BLOOD.STATE<2 ");
                List<OracleParameter> lps = new List<OracleParameter>();
                #region 查询条件
                if (bloodId != "")
                {
                    lps.Add(new OracleParameter(":bloodID", bloodId));
                    sb.Append("AND CTL_CHA_BLOOD.BLOODID=: bloodID ");
                }
                else
                {
                    if (patientId != "")
                    {
                        lps.Add(new OracleParameter(":patientID", patientId));
                        sb.Append("AND CTL_CHA_BLOOD.PATIENTID=:patientID ");
                    }
                    if (name != "")
                    {
                        lps.Add(new OracleParameter(":name", "%" + name + "%"));
                        sb.Append("AND CTL_PATIENT_MESSAGE.NAME LIKE :name ");                }
                    if (div_id != "")
                    {
                        lps.Add(new OracleParameter(":div_id", div_id));
                        sb.Append("AND CTL_CHA_BLOOD.DIV_ID=:div_id ");
                    }
                    if (rack_id != "")
                    { 
                        lps.Add(new OracleParameter(":rack_id", rack_id));
                        sb.Append("AND CTL_CHA_BLOOD.RACK_ID=:rack_id ");
                    }
                    if (box_id != "")
                    {
                        lps.Add(new OracleParameter(":box_id", box_id));
                        sb.Append("AND CTL_CHA_BLOOD.BOX_ID=:box_id ");
                    }
                }
                #endregion
                //sb.Append("ORDER BY CTL_CHA_BLOOD.ID DESC) CCB  )  WHERE RN BETWEEN " + a + " AND " + b + "");
                //sb.Append("ORDER BY CTL_CHA_BLOOD.ID DESC) CCB  )  WHERE RN BETWEEN 0 AND 20 ");
                sb.Append("ORDER BY CTL_CHA_BLOOD.ID DESC) CCB  ) ");
                return sqlHelper.GetDataSet(sb.ToString(), lps.ToArray(), firstPage, pageSize, "CTL_CHA_BLOOD");
            }
      

  23.   

    //绑定数据的部分
    public void BindData()
        {
            string bloodID = "";
            string patientID = "";
            string name = "";
            string liquid_num = "";
            string rack_num = "";
            string box_num = "";
            int firstPage = AspNetPager1.PageSize * (AspNetPager1.CurrentPageIndex - 1);
            int pageSize = AspNetPager1.PageSize;
            int a = AspNetPager1.PageSize * (AspNetPager1.CurrentPageIndex - 1) + 1;
            int b = AspNetPager1.PageSize * (AspNetPager1.CurrentPageIndex);        DataSet ds = cbb.SearchChaBlood(bloodID, patientID, name, liquid_num, rack_num, box_num, firstPage, pageSize, a, b);
            if (ds != null && ds.Tables[0].Rows.Count != 0)
            {
                this.gvBlood.DataSource = ds.Tables[0].DefaultView;
                this.gvBlood.DataBind();
            }
            try
            {
                if (ds.Tables[0].Rows.Count == 0)
                {
                    ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
                    gvBlood.DataSource = ds;
                    gvBlood.DataBind();
                    int columnCount = gvBlood.Rows[0].Cells.Count;
                    gvBlood.Rows[0].Cells.Clear();
                    gvBlood.Rows[0].Cells.Add(new TableCell());
                    gvBlood.Rows[0].Cells[0].ColumnSpan = columnCount;
                    gvBlood.Rows[0].Cells[0].Text = "没 有 记 录";
                    gvBlood.Rows[0].Cells[0].Height = 30;
                    gvBlood.Rows[0].Cells[0].HorizontalAlign = HorizontalAlign.Center;
                    //gvBlood.Rows[0].Cells[0].ForeColor = System.Drawing.Color.Blue;
                    //gvBlood.Rows[0].Cells[0].BackColor = System.Drawing.Color.FromName("#fff");
                }
            }
            catch (Exception ex)
            {
            }
            //动态设置用户自定义文本内容    
            AspNetPager1.CustomInfoHTML = "记录总数:<font color=\"blue\"><b>" + AspNetPager1.RecordCount.ToString() + "</b></font>&nbsp;";
            AspNetPager1.CustomInfoHTML += " 总页数:<font color=\"blue\"><b>" + AspNetPager1.PageCount.ToString() + "</b></font>&nbsp;";
            AspNetPager1.CustomInfoHTML += " 当前页:<font color=\"red\"><b>" + AspNetPager1.CurrentPageIndex.ToString() + "</b></font>";
        }//SQL语句部分
    public DataSet SearchChaBlood(string bloodId, string patientId, string name, string div_id, string rack_id, string box_id, int firstPage, int pageSize, int a, int b)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("SELECT     RN,BLOODID,PATIENTID,PATIENT_NAME,LESION_ORGAN,");
                sb.Append("           BLOOD_PERSON,BLOOD_DATE,DIV_ID,RACK_ID,");
                sb.Append("           BOX_ID,SAMPLE_XY,INBOUND_DATE, ");
                sb.Append("           INBOUND_HANDLER,OUTBOUND_DATE, OUTBOUND_HANDLER,");
                sb.Append("           EDIT_TIMES,LASTEDIT_DATE,LASTEDIT_HANDLER,STATE,");
                sb.Append("           DELETE_HANDLER,DELETE_DATE ");
                //sb.Append("FROM       CTL_CHA_BLOOD, CTL_PATIENT_MESSAGE ");
                sb.Append("FROM      (SELECT ROWNUM RN , CCB.* FROM ");
                sb.Append("          (SELECT    CTL_CHA_BLOOD.*,CTL_PATIENT_MESSAGE.NAME AS PATIENT_NAME ");
                sb.Append("           FROM CTL_CHA_BLOOD,CTL_PATIENT_MESSAGE ");
                sb.Append("           WHERE      CTL_CHA_BLOOD.PATIENTID = CTL_PATIENT_MESSAGE.PATIENTID AND CTL_CHA_BLOOD.STATE<2 ");
                List<OracleParameter> lps = new List<OracleParameter>();
                #region 查询条件
                if (bloodId != "")
                {
                    lps.Add(new OracleParameter(":bloodID", bloodId));
                    sb.Append("AND CTL_CHA_BLOOD.BLOODID=: bloodID ");
                }
                else
                {
                    if (patientId != "")
                    {
                        lps.Add(new OracleParameter(":patientID", patientId));
                        sb.Append("AND CTL_CHA_BLOOD.PATIENTID=:patientID ");
                    }
                    if (name != "")
                    {
                        lps.Add(new OracleParameter(":name", "%" + name + "%"));
                        sb.Append("AND CTL_PATIENT_MESSAGE.NAME LIKE :name ");                }
                    if (div_id != "")
                    {
                        lps.Add(new OracleParameter(":div_id", div_id));
                        sb.Append("AND CTL_CHA_BLOOD.DIV_ID=:div_id ");
                    }
                    if (rack_id != "")
                    { 
                        lps.Add(new OracleParameter(":rack_id", rack_id));
                        sb.Append("AND CTL_CHA_BLOOD.RACK_ID=:rack_id ");
                    }
                    if (box_id != "")
                    {
                        lps.Add(new OracleParameter(":box_id", box_id));
                        sb.Append("AND CTL_CHA_BLOOD.BOX_ID=:box_id ");
                    }
                }
                #endregion
                sb.Append("ORDER BY CTL_CHA_BLOOD.ID DESC) CCB  )  WHERE RN BETWEEN " + a + " AND " + b + "");
                            return sqlHelper.GetDataSet(sb.ToString(), lps.ToArray(), firstPage, pageSize, "CTL_CHA_BLOOD");
            }
      

  24.   

    前面那个不对了.应该是下面那个.
    sb.Append("ORDER BY CTL_CHA_BLOOD.ID DESC) CCB  )  WHERE RN BETWEEN " + a + " AND " + b + "");