你的猜想是正确的DataGrid本身没有所谓的数据缓冲,实际上它的数据来自它的数据源,就是DataSource我想你们肯定用的是DataSetWeb程序不会自动保存状态,除了服务器控件会保存状态到ViewState,任何没有编码来保存的状态(包括数据),都会在一次请求完毕之后就释放掉所以DataGrid的分页实际上就是获取数据源中的所有数据,然后根据目前的页码(这个会保存在ViewState中)来从数据源中获取一部分数据,也就是一页的数据,然后显示到客户端,到客户端时,实际上就只有这一页的数据,ViewState里面也只包含这一页的数据,这就是为什么分页的时候要重新绑定数据的原因;这是有道理的,如果大量的数据传到客户端,而只显示一部分,这违背了分页来减轻网络负担的初衷,加大了网络传输量。实际上没有什么你所谓的“数据缓冲”的概念,不过如果你的数据实时性不是很高,你可以考虑把数据放到Cache中,再次提醒,这些手段.Net都提供了方法,但是这些是需要开发者自己选择的,所以它不会自动帮你做。

解决方案 »

  1.   

    ADO.NET doesn't have burden of caching, it is in your hand. You shouldn't retrieve all 20000 records at one time, you should just retrieve 20 at a time
      

  2.   

    to  timmy3310(tim):
      还有个问题,我的数据集(DataSet)是通过WebService调用返回的,如果Web Server没有进行数据缓冲(我说的是在服务器端缓冲),那么每次DataGrid的翻页时就要由.NET WebServer自己自动来调用我上次的WebService调用,实际情况是这样的么?
      

  3.   

    to saucer:
      在SQLServer 2000中,每次取20条记录的SQL怎么写,多谢了~!
      

  4.   

    是这样的你的代码里面肯定有绑定数据的代码,通过调用Web Service来获取数据每次分页的时候都会重新绑定,这不是自动执行的,因为每页会PostBack,我猜想你的数据绑定的代码在Page_Load中,所以每次都会执行一次Web Service的方法
      

  5.   

    for the first 20:select top 20 * from yourtable order by somecolumnremember the first and last value of "somecolumn" in the current 20for the next (forward) 20, doselect top 20 * from yourtable where somecolumn > itsLastValue order by somecolumnto go back by 20, doselect * from (select top 20 * from yourtable where somecolumn < itsFirstValue order by somecolumn desc) t order by somecolumnyou can encapsulate these or similar statements in a stored procedure
      

  6.   

    to  timmy3310(tim):
      似乎不是这样的,我的PageLoad代码如下: if (!Page.IsPostBack)
    {
    if (Request.QueryString["search"]=="view")
    {
    Page_Init();
    Page_post();
    BindData();
    }
    }
    其中bindData负责绑定数据,但不是在PostBack中执行的
      

  7.   

    select top 20 * from tablename
      

  8.   

    to 思归:
      我的数据集中的排序字段不是Identity的,就是说,后加的记录可能排序后会列在前面,而且数据表中的数据是不断变化的,即有可能会不断插入数据,所以如果按照你的办法,每次翻页的数据可能不是一样的。
      不知有没有别的办法,在SQLServer中不知道有没有Oracle中类似于RowID的字段可以表示数据插入数据库的先后次序,这样就可以保证你的办法可行。
      

  9.   

    你分页的事件中一定绑定了数据,也就是执行了BindData()的方法,这也是一样的
      

  10.   

    to timmy3310:
      谢了,你是对的。
      等SQL的问题一有结果,就揭帖。
      

  11.   

    按数据库查询,确实会出现你说的:
    “后加的记录可能排序后会列在前面,而且数据表中的数据是不断变化的,即有可能会不断插入数据,所以如果按照你的办法,每次翻页的数据可能不是一样的。”
    的问题,但是用你目前的方式,同样有这个问题,因为每次翻页的数据都是重新获取的这两个的差别只是在于一个是在数据库端筛选数据,一个是在Web Server端筛选数据,就筛选的效率来说,前者会高一些,但高不了很多,不过如果数据库和Web Server不在一台机器上,利用数据库分页会减少数据库服务器到Web Server的数据传输量不过就你目前的应用,主要瓶颈我觉得是在Web Service传输数据上,因为Web Service利用基于Http的SOAP协议传输数据,这比数据库服务器利用Tcp通道要慢,而且数据传输需要序列化和反序列化,所以我建议你在Web Service端进行分页,不管利用数据库分页还是自己写分页也好,这样可能会相对多的提高你的效率。
      

  12.   

    to timmy3310(tim):
      现在的问题不仅仅是查询性能的问题,关键是我需要取得每页20条的稳定记录,就是说我第一页显示后,点击Next进入下一页20条记录,然后Prev回第一页时,第一页的记录应该与我第一次进入时显示的第一页记录完全相同(造成不同的原因是数据库总是在更新,可能新的记录会插入,而且我的数据集又没有办法按照数据库插入的顺序排序)。
      

  13.   

    其实问题归根结底就是说,SQLServer能否对一个没有Identity字段的数据表按照记录插入的先后次序排序?
      

  14.   

    我想应该是没有那怕查询时不用Order查出来的很可能是按照插入的顺序,但这不一定是绝对的,所以这样不保险
      

  15.   

    是的,Oracle中有个RowID字段,可以实现这个功能,但SQLServer中,我就不知道了。如果真的没有,我想也没有别的办法,只有申请修改数据库,在表中加一个Identity字段了。