查询出来的结果集,为一个ArrayList,对象数量上万,保存在viewstate做自定义分页。导致页面速度较慢。可能方法拙劣,但不才,想不到更有效率的解决方法。请问大家有什么好的建议呢?先谢了。

解决方案 »

  1.   

    1 我认为数据读取应该是轻量级的   一下上万条 不太可取 有很多存储过程分页的例子 楼主多找找。2 ViewState 比较适合保存 控件状态(本来也就是用来保存控件状态的。)  和变量。 况且ViewState 不安全。
      

  2.   

    1 先明确一下我的需求。
    我要做的是将数据库中某表的所有数据轮询并对每条记录都生成一个返回值,并保存在上述的结果集ArrayList当中,并根据计算出来的返回值排序。因此,必须将所有数据取出,一万条应该是不能避免的。
    楼上所说的,存储过程分页的例子,我用过,包括webdiyer的aspnetpager。但存储过程分页是将数据库中的某段数据取出并计算显示,而我要做的是将全部的数据计算并显示排序,分页。因此,该方法也有待继续探讨。2 我读了读MSDN上的“状态管理建议”这篇文章,根据我的需求,可能只有采用数据库支持才能维护站点的状态,但目前还不能修改数据库,其他几种方法又对大对象操作效率不高,希望做过类似的朋友可以提点建议。
    ps:谢谢楼上。
      

  3.   

    viewstate由页面保存,并会发送给客户端。页面不能太大,是要从服务器发送给客户的,而且每次postback都会重新发送,考虑一下网络吧
    如果非要把数据全取出来,可以考虑cache,session也行。页面不可能同时显示1W条以上,把要显示的从cache里取。
      

  4.   

    Cache..除了不附加在HTML 里 和VIEWSTATE 没啥区别。看能不能换种思路
      

  5.   

    re:xiaoqhuang 
    cache有考虑过,但客户端支持是个问题。而且,涉及到磁盘文件读写的话,会比在内存中直接操作效率更高么?
      

  6.   

    re :LikeCode 
    分页读取,不能将结果集整体排序。比如第一页中,第1条到第5条得出的数据为0.9,0.6,0.6,0.5,0.2;第二页中数据为0.95,0.8,0.6,0.2,0.1,0.03。但我要0.95这条数据显示在第一页,即0.95,0.9,0.8,0.6,0.6,0.6。
      

  7.   

    QUOTE:分页读取,不能将结果集整体排序。比如第一页中,第1条到第5条得出的数据为0.9,0.6,0.6,0.5,0.2;第二页中数据为0.95,0.8, 0.6,0.2,0.1,0.03。但我要0.95这条数据显示在第一页,即0.95,0.9,0.8,0.6,0.6,0.6。
    ------------------
    分页读取也可以排序读取的.
      

  8.   

    甚至查找都能分页读取.
    象这样的存储过程有很多,.
    听说MS SQL 05 可以指定回返行数, 不需要存储过程那么麻烦了.http://www.code-studio.net/CSView.aspx?aid=244
    SQL Server 2000通用分页查询存储过程(可指定返回字段,查询条件)
      

  9.   

    QUOTE:分页读取,不能将结果集整体排序。比如第一页中,第1条到第5条得出的数据为0.9,0.6,0.6,0.5,0.2;第二页中数据为0.95,0.8,   0.6,0.2,0.1,0.03。但我要0.95这条数据显示在第一页,即0.95,0.9,0.8,0.6,0.6,0.6。 
    ------------------ 
    分页读取也可以排序读取的.----------------
    请说仔细一点可以吗?谢谢
      

  10.   

    QUOTE:请说仔细一点可以吗?谢谢
    ----------------
    看9楼的回复
      

  11.   

    将LikeCode指定的http://www.code-studio.net/CSView.aspx?aid=244 存储过程分页贴出来
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetRecordByPage]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[GetRecordByPage]
    GOCREATE PROCEDURE GetRecordByPage
        @tblName      varchar(255),       -- 表名
        @fldName      varchar(255),       -- 主键字段名
        @PageSize     int = 10,           -- 页尺寸
        @PageIndex    int = 1,            -- 页码
        @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
        @strWhere     varchar(1000) = '', -- 查询条件 (注意: 不要加 where)
        @IsReCount    bit = 0,            -- 返回记录总数, 非 0 值则返回
        @FieldList    varchar(200)        -- 返回的字段
    ASdeclare @strSQL   varchar(6000)       -- 主语句
    declare @strTmp   varchar(100)        -- 临时变量
    declare @strOrder varchar(400)        -- 排序类型
    if @PageIndex = 0
     begin
      set @PageIndex = 1
     end
    if @OrderType != 0
    begin
        set @strTmp = '<(select min'
        set @strOrder = ' order by [' + @fldName +'] desc'
    end
    else
    begin
        set @strTmp = '>(select max'
        set @strOrder = ' order by [' + @fldName +'] asc'
    endif @strWhere != ''---条件不为空
        set @strSQL = 'select top ' + str(@PageSize) + ' ' + @FieldList + ' from ['
            + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
            + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
            + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
            + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
    else---条件为空
    set @strSQL = 'select top ' + str(@PageSize) + ' ' + @FieldList + ' from ['
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
        + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
        + @strOrder    set @strTmp =''
        if @strWhere != ''
            set @strTmp = ' where ' + @strWhereif @PageIndex = 1
    begin
        set @strSQL = 'select top ' + str(@PageSize) + ' ' + @FieldList + ' from ['
            + @tblName + ']' + @strTmp + ' ' + @strOrder
    endif @IsReCount != 0
        set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+ @strTmpexec (@strSQL)
    GO
    26行的
    -------------
    begin
        set @strTmp = '<(select min'
        set @strOrder = ' order by [' + @fldName +'] desc'
    end
    else
    begin
        set @strTmp = '>(select max'
        set @strOrder = ' order by [' + @fldName +'] asc'
    end
    ------------这里排序字段是可排序的字段类型,但我的排序依据字段是一个image类型(不能order by )。是通过计算所有数据的图像二进制长度排序结果集。
      

  12.   

    IMAGE...我暂时不知道对IMAGE排序有什么意义....文件大小?!
      

  13.   

    IMAGE...我暂时不知道对IMAGE排序有什么意义....文件大小?!----------
    需求是让通过提取image的特征并计算。
      

  14.   

    用分页存储过程吧~何况你页面也显示不了1W数据~何苦保存在viewstate里~