数据库里有views表和uptime两个字段
views字段存在多条数据值一样
uptime字段值理论上是唯一的数据大概1000条左右。如果使用uptime字段作为排序字段没问题。如果使用views字段作为排序,在一个界面全部显示的情况下没问题。但如果程序使用了分页功能,当分到5页以后就没数据显示了。同时在5页上,不停刷新,数据的位置会一直变动。那位大哥知道是为什么呀?
views字段存在多条数据值一样
uptime字段值理论上是唯一的数据大概1000条左右。如果使用uptime字段作为排序字段没问题。如果使用views字段作为排序,在一个界面全部显示的情况下没问题。但如果程序使用了分页功能,当分到5页以后就没数据显示了。同时在5页上,不停刷新,数据的位置会一直变动。那位大哥知道是为什么呀?
结果是这样
views uptime
5 5
5 4
5 2
4 3
4 1
看看你的程序
/// <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)
比如: order by views, uptime
或者:order by views, 主键没有其他的办法。