数据库里有views表和uptime两个字段
views字段存在多条数据值一样
uptime字段值理论上是唯一的数据大概1000条左右。如果使用uptime字段作为排序字段没问题。如果使用views字段作为排序,在一个界面全部显示的情况下没问题。但如果程序使用了分页功能,当分到5页以后就没数据显示了。同时在5页上,不停刷新,数据的位置会一直变动。那位大哥知道是为什么呀?

解决方案 »

  1.   

    这好办啊,先安views排序然后再按uptime排序试试
    结果是这样
    views uptime
    5       5
    5       4
    5       2
    4       3
    4       1
      

  2.   

    不要以views这样的来做排序。
    看看你的程序
      

  3.   

    我这里要做点击次数来排序,如果不用viwes这样,那用什么排序?
      

  4.   


    /// <summary>
        /// 绑定服务器分页控件
        /// </summary>
        /// <param name="ControlObj">服务器控件绑定的对象</param>
        /// <param name="TableName">分页的表名</param>
        /// <param name="WhereStr">查询条件,不要加Where关键字</param>
        /// <param name="ReColumns">需要返回的列,各字段之间用","隔开,所有</param>
        /// <param name="order">排序字段</param>
        /// <param name="PageSize">每页显示的条数</param>
        /// <param name="PageIndex">当前页</param>
        /// <param name="OrderType">排序方式; 非 asc值则降序 </param>
        public static void ControlObjectControl(Control ControlObj, String TableName, string WhereStr, string ReColumns, string order, int PageSize, int PageIndex, string OrderType)
        {
            dbclass db = new dbclass();
            dbclass.ProceducreParameter[] Parameter = new dbclass.ProceducreParameter[8];
            Parameter[0].dbType = SqlDbType.VarChar; Parameter[0].ObjValue = TableName; Parameter[0].strName = "@tblName";
            Parameter[1].dbType = SqlDbType.VarChar; Parameter[1].ObjValue = ReColumns; Parameter[1].strName = "@RetColumns";
            Parameter[2].dbType = SqlDbType.VarChar; Parameter[2].ObjValue = order; Parameter[2].strName = "@Orderfld";
            Parameter[3].dbType = SqlDbType.Int; Parameter[3].ObjValue = PageSize; Parameter[3].strName = "@PageSize";
            Parameter[4].dbType = SqlDbType.Int; Parameter[4].ObjValue = PageIndex; Parameter[4].strName = "@PageIndex";
            Parameter[5].dbType = SqlDbType.Bit; Parameter[5].ObjValue = 0; Parameter[5].strName = "@IsCount";
            Parameter[6].dbType = SqlDbType.VarChar; Parameter[6].ObjValue = OrderType; Parameter[6].strName = "@OrderType";
            Parameter[7].dbType = SqlDbType.VarChar; Parameter[7].ObjValue = WhereStr; Parameter[7].strName = "@strWhere";
            DataSet ds = db.GetProcedure_DataSet("GetRecordFromPage", Parameter, "PagerList");
            if (ControlObj.GetType() == typeof(GridView))
            {
                GridView control = (GridView)ControlObj;
                control.DataSource = ds;
                control.DataBind();
            }        else if (ControlObj.GetType() == typeof(DataList))
            {
                DataList control = (DataList)ControlObj;
                control.DataSource = ds;
                control.DataBind();
            }
            else if (ControlObj.GetType() == typeof(Repeater))
            {
                Repeater control = (Repeater)ControlObj;
                control.DataSource = ds;
                control.DataBind();
            }
            else if (ControlObj.GetType() == typeof(FormView))
            {
                FormView control = (FormView)ControlObj;
                control.DataSource = ds;
                control.DataBind();
            }
            else if (ControlObj.GetType() == typeof(DataGrid))
            {            DataGrid control = (DataGrid)ControlObj;
                control.DataSource = ds;
                control.DataBind();
            }
            else if (ControlObj.GetType() == typeof(DetailsView))
            {            DetailsView control = (DetailsView)ControlObj;
                control.DataSource = ds;
                control.DataBind();
            }    }
    SET ANSI_NULLS OFF
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER   PROCEDURE  [dbo].[GetRecordFromPage]   
              @tblName            varchar(255),                --   表名 
              @RetColumns         varchar(1000) = '*',         --   需要返回的列,默认为全部   
              @Orderfld           varchar(255),                --   排序字段名   
              @PageSize           int  =  10,                  --   页尺寸   
              @PageIndex          int  =  1,                   --   页码   
              @IsCount            bit  =  0,                   --   返回记录总数,   非   0   值则返回   
              @OrderType          varchar(50)  =  'asc',       --   设置排序类型,   非   asc   值则降序   
              @strWhere           varchar(1000)  =  ''         --   查询条件   (注意:   不要加   where)   
      AS
          
      declare   @strSQL       varchar(1000)          --   主语句   
      declare   @strTmp       varchar(300)           --   临时变量   
      declare   @strOrder     varchar(400)           --   排序类型   
        
      if  @IsCount  !=   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  !=   'asc'   
    begin   
    set   @strTmp   =   '<(select   min'   
    set   @strOrder   =   '   order   by   ['   +   @Orderfld   +']   desc'   
    end   
    else   
    begin   
    set  @strTmp   =   '>(select   max'   
    set  @strOrder   =   '   order   by   ['   +   @Orderfld   +']   asc'   
    end   

    set  @strSQL   =   'select   top   '   +   str(@PageSize)   +   '   ' + @RetColumns + '    from   ['   
    +   @tblName   +   ']   where   ['   +   @Orderfld   +   ']'   +   @strTmp   +   '(['   
    +   @Orderfld   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   ['   
    +   @Orderfld   +   ']   from   ['   +   @tblName   +   ']'   +   @strOrder   +   ')   as   tblTmp)'   
    +   @strOrder   

    if  @strWhere  !=   ''   
    set   @strSQL   =   'select   top   '   +   str(@PageSize)   +   '   ' + @RetColumns + '   from   ['   
    +   @tblName   +   ']   where   ['   +   @Orderfld   +   ']'   +   @strTmp   +   '(['   
    +   @Orderfld   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   ['   
    +   @Orderfld   +   ']   from   ['   +   @tblName   +   ']   where   ('   +   @strWhere   +   ')   '   
    +   @strOrder   +   ')   as   tblTmp)   and   ('   +   @strWhere   +   ')   '   +   @strOrder   

    if  @PageIndex   =   1   
    begin   
    set   @strTmp   =   ''   
    if   @strWhere   !=   ''   
    set   @strTmp   =   '   where   ('   +   @strWhere   +   ')'   

    set   @strSQL   =   'select   top   '   +   str(@PageSize)   +   '   ' + @RetColumns + '   from   ['  
    +   @tblName   +   ']'   +   @strTmp   +   '   '   +   @strOrder   
    end
     end
       
    --print((@strSQL)) 
    exec  (@strSQL)
      

  5.   

    作为排序的最后一个字段的值,是不能有重复值的,如果有分页很可能会出现混乱。因为无法准确的确定,一条记录是上一页的还是下一页的。就好比成绩排名,如果两名同学都是90分,那么谁排在前面呢?这就必须有一个明确的规则,规则不明就没有办法排序。分页也是同样的道理。所以要解决你的问题,必须在排序字段中,加一个没有重复值的字段。
    比如: order by views, uptime
    或者:order by views, 主键没有其他的办法。