如何提取一个大型数据库的某记录的下一条记录(50)

  • 主题发起人 主题发起人 lingmao3
  • 开始时间 开始时间
L

lingmao3

Unregistered / Unconfirmed
GUEST, unregistred user!
如果小数据库,直接用adoquery1.next,就解决了,问题就是记录太多,var ADOQuerytemp : TADOQuery;begin //aaaa 联数据字典ADOQuerytemp := TADOQuery.Create(Application);ADOQuerytemp.Close;ADOQuerytemp.Connection := FormMain.ADOConnection; //改为//Connection := ADOConnection1; //改为ADOQuerytemp.Sql.Clear;ADOQuerytemp.Sql.Add('select * From t_xjtest order by 编号');ADOQuerytemp.Open; //====================================这里这开始等啊等,等到超时:<ADOQuerytemp.Locate('编号','a0001',[]);ADOQuerytemp.next;editwheretemp.text:=' and 编号='''+ADOQuerytemp.FieldByName('报告编号').Asstring+'''';ADOQuerytemp.Free;end; //aaaa因为我不知道流水号的条件是什么,否则我就用条件来圈定范围以减少数据量.
 
ADOQuerytemp.Sql.Add('select 编号,报告编号 From t_xjtest order by 编号');加点条件吧!
 
order by有时候会导致速度很慢,因为后台需要对数据进行排序啊,不知道加上索引是否可以提高速度,没测试过,对于大数据量,我一般都加一些where条件的。------ADOQuerytemp.Sql.Add('select 编号 From t_xjtest where 编号'>=''a0001'' order by 编号' )
 
如果用存储过程,怎么写?
 
存储过程里面的SQL:select @result = min(编号) From t_xjtest where 编号> @传入的编号-----------速度还是慢,且没有索引速度将无法忍受。Locate函数不可取,因为Locate是对当前机器内存中的数据进行操作的,举例来说如果你的数据库有3千万零1条记录,现在的编号是第3千万条记录的编号,则Locate的时候,程序将会把这3千万条记录先加载到本地,然后再能定位到。
 
索引是必须要加的。另外 ADOQuerytemp.Sql.Add('select Top 100 * From t_xjtest order by 编号');等下次去数据的时候就有了第101条数据的编号了,利用Where就可以了
 
select top 1 * from where 编号>传入的编号 order by 编号只有一条记录
 
后退
顶部