我写了一个程序需要精确定位数据库中的第几条记录:
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('declare mycusor scroll cursor for select orderid from orders');
SQLQuery2.SQL.Add('open mycusor');
sString:='fetch absolute '+inttostr(变量)+' from mycusor';
SQLQuery2.SQL.Add(sString);
SQLQuery2.SQL.Add('close mycusor');
SQLQuery2.SQL.Add('deallocate mycusor');
SQLQuery2.Active:=True;
curorderid:=SQLQuery2.FieldByName('OrderId').value;
我想问,除了我这个笨办法外,还有没有更为简单的办法,难道delphi没有这样的锋装么?

解决方案 »

  1.   

    各位可能没有理解我的意思,不过还是要谢谢大家的参与。
    我假定在一个非常庞大的数据库浏览所有数据,并且假定在一个慢速网络上进行查询。当我们用clientdataset等组件的时候,要么下载所有的数据,然后进行定位是完全可以的,要么只能顺序浏览几十条数据,不能让客户自己选定比如地30条到第49条数据,也就是分页后,让用户自己选定浏览哪一页的数据。我现在用这个程序已经能实现我的要求了,但也因此花费了很多的精力,也许大家都看到了,我筛选出来的数据完全是在数据库服务器上进行的。所以我想各位有没有更好的办法
      

  2.   

    转贴:1.分页程序这样每次建立临时表,我觉得非常浪费,因为这个检索的表非常庞大,每次消耗的内存是非常之多的(临时表在SQL端占内存)
    尤其是对于VC开发的客户端程序,这种浪费是比较吓人的!2.建立临时表之后就不管了,也太粗心了吧,我看还是需要做点工作,
    好了下面是我的一个分页过程,各位看看吧!--------------------------------------------------------create procedure sp_vlist @cpbmb varchar(6),@crbh varchar(2) with encryption as
    set nocount on
    declare @sqlcmd varchar(148)
    if object_id('tempdb..##vlist') is not null
      drop table ##vlist
    set @sqlcmd='select identity(int, 1,1) as id, * into ##vlist from '+@cpbmb+' where crbh='''+@crbh+''' order by cpxh
    create index ##vlist_id on ##vlist(id)'
    exec(@sqlcmd)
    set nocount off---------------------------------------------------
    ^_^,这只是个建立全局临时表的过程,这样即可一劳永逸,在你的分页程序中使用between进行检索,而between需要倚赖nonclustered index提升效率!这样你既可以进行排序,也可进行快速检索,例如:select * from ##vlist where id between 10 and 20 order by cpxh
    这个存储过程我认为还是非常有效的,它可以针对不具有连续id的子查询进行分页,我用来开发VC的虚拟列表,现在只要内存足够,那么对于2,000,000记录的表操作起来和查询分析器一样快,当然看通的朋友知道这只是内存的问题了,即使100,000,000记录,分页速度也是一样的!
      

  3.   

    这个方法其实占用了服务器上大量的存储空间,其复杂度跟我的方法也差不了多少。我这个方法对服务器的cpu可能要求较高,但问题上是上面这个方法也不见得更好。请各位继续讨论,不过倒是给了我另外一个思路。
      

  4.   

    不过,在delphi中可以用moveby(+ -N)来定位第几条
      

  5.   

    Locate方法不错具体的可以看看帮助
      

  6.   

    用BOOKMARK ,查询资料
    很简单的