当lbb(类别表)主表移动时,我不想jbxx(基本信息)从表, 相关的数据库全都显示出来。大约有5000条记录吧, 也就是一个类别里头有5000条记录。一个form最多显示50条, 在form上加上了上一页、 下一页。当点击下一页取出50条显示出来。  能不能执行到adoquery.active:=True;
时不把所有的记录都取出来。 只取出50条,以后 点击下一页时再显示出来

解决方案 »

  1.   

    你这样直接SELECT 100000条还带图片的记录,想高速是不可能的.甚至还要因为内存不足打不开很多记录.
    必须限制每次提取到客户端的记录数.
    [email protected]
      

  2.   

    要不,你不要在SELECT语句中 读取图片字段., 当用户需要看是再用另一个QUERY读取显示. 不能把100000个图片全部读到客户端的内存中去.再一点,试试ADO的异步执行模式, 或许效果更好些.
      

  3.   

    我也是这样的想法。 加了一个向上或向下的按钮。在代码里用select 来调用。
    当主表移动时, 会执行哪些操作或方法。  我记得有个事件是把对应相应从表的数据过滤出来我想只显示过滤的前50条记录。 这样做可以吗?
      

  4.   

    试试ado的异步执行模式,并且将cachesize设成1000试试
      

  5.   

    to wgzhou747217(蔡鸟) 异步怎样设置。
      

  6.   

    在Select语句中好象可以控制记录的条数
    但是对于图片的形式我不态了解;
    还有,请教各位ado的异步执行模式是什么原理,请多赐教!
      

  7.   

    应该只传输需要的数据,如果确实要这么多的数据,可以用多次少量的方法。
    可以用语句select top 100 * from MyDb,然后再用cursor取后面的数据
    这样速度会很快的
      

  8.   

    1.采用异步存取模式
    2.写sql语句只取需要的数据,比如一页50行,就只取50条记录。其余的翻页时再取。
      

  9.   

    大家说的意思我大至理解了。 需要多少取多少。 我想一次取30条。 例如: 点击类别(lbb表)-->基本信息(jbxx)对就的明细全都显示出来了(有可能达到5000条,这样数据也很多)。所以我想第一次取出该类别的前30条记录。 点击下一页时取出该类别的30-60页,再点击就是60-90,    我该怎样写这个sql语句,   当主表移动时 好像有一个方法是取出所有对应的明细。 这个方法是什么?  我想把代码写在这个方法里面不知道我描述清楚没有。? ,有疑问吗?
      

  10.   

    我的解决方法
    1、在select 语句中不要加入图片字段,用户想看图片时可以考虑通过双击弹出另一个窗体的方法来专门显示图像,这样可以解决缓冲的问题
    2、想分页显示,那么可以利用这个表的主关键字(注意:主关键字必须是一个字段,两个字段或两个以上的复合主键不能用这种方法)来排序,查询语句是这样的: select top 30 field1,field2 from table1 where key>:Value
    你每次点击下一页时,先执行一个adoquery的last操作,放一个变量来取得最末一条记录的值,再把这个数值放到select语中,就可以选择下一页的数据了
    3、如果想做得好一些,那么需要另放一个adocommand的控件,通过它来一次性取得记录的总条数,再除以每页多少条记录来得出总页数,这样最到最末一页时就可以控制下一页的按钮变灰
    4、如果单纯只是按下一页存取,这都简单,但如果客户想按“上一页”时取出上一页的记录,这时select语句就要复杂一些,有兴趣再和我讨论
      

  11.   

    同意txinfo(冰炎两重天) ,可以分页显示。
      

  12.   

    你可以这样,// 当记录移动时,根据图形的BlobSize确定是否从数据库得到图形。
    procedure TForm1.ADODataSet1AfterScroll(DataSet: TDataSet);
    begin
      if ADODataSet1photo.BlobSize <> 0 then
        LoadFromTField    
      else Image1.Picture := nil;
    end;//从数据库得到图形,显示在Image1中。
    procedure TForm1.LoadFromTField;
    var
     jpeg  : TJPEGImage;
     BS : TADOBlobStream;
    begin
      BS := TADOBlobStream.Create(ADODataSet1photo, bmRead);
      jpeg := TJPEGImage.Create;
      try
        jpeg.LoadFromStream(BS);
        Image1.Picture.Graphic := jpeg;
        //Image1.Picture.Assign(jpeg);也是对的。
      finally
        jpeg.Free;
        BS.Free;
      end;
    end;这个方式是在记录被浏览时,动态的从数据库中提取图片信息。其速度很快很快。
      

  13.   

    他妈的,这个CSDN有问题,
    我的程序有退格的,传上来后居然全部左对齐了。
    做的歪···
      

  14.   

    对于大数据量的表,为了提高访问速度,首先在建表的时候考虑表的索引,并且索引要相对于你需要访问的字段要对应,这样在访问的时候速度是很快的,由于你有图片信息,所以我不知道你的图片字段占用的大小,不过我做过100万条的数据库,速度也就在几秒之内可以用grid列举出来。
    在网站上的大数据量的展示是分页来实现的,一般都会开辟一个缓冲,来存放后面的数据,比如一次去50条,那么第一次就会去150条左右,有100条是在缓冲中,这样可以满足数据上的需求。
      

  15.   

    尝试设置ADODataSet的MaxRecord属性,不要让它为0,这样会把所有记录信息都
    提取到内存来,尝试为100或者左右的值,你会发现速度大大加快,而且内存占用大大减少。  God Luck!
      

  16.   

    对这个数据库你的操作大致有如下几种:
    1)新增========== INSERT (只处理一条记录)
    2)修改========== UPDATA (只处理一条记录)
    3)删除========== DELETE (只处理一条记录)
    4)查询========== SELECT (符合要求的记录)前三种情况SQL执行的很快没有问题
    第四种情况你只有限制条件,速度也不会是大问题的。不论什么操作都先把大数据集打开,编程方便,使用不便!从表加内部序列号,用TOP N分组 或者根据序号加限制条件。