当前位置:  开发笔记 > 数据库 > 正文

如何防止Delphi ADO将整个表加载到内存中?

如何解决《如何防止DelphiADO将整个表加载到内存中?》经验,为你挑选了2个好方法。

我不是Delphi程序员,但我得到了一个旧的Delphi 7应用程序,我需要修复它并使用ADO.

数据库表(MS Access)包含+100,000行,当我设置ADOTable.Active = true时,它开始将整个表加载到RAM中,这需要大量的内存和时间.

如何防止ADO加载整个表?我试图设置MaxRecords,但它没有帮助.

基本上我们所做的只是程序启动:

// Connect to database
DataModule.MyADOConnection.Connected:=true;

DataModule.MeasurementsADOTable.MaxRecords:=1;

// Open datatables
DataModule.MeasurementsADOTable.Active:=true;                  

设置Active = true后,它开始将整个测量加载到RAM中,需要TIME!

我们正在使用MSDASQL.1提供程序.也许它不支持MaxRecords属性?

如何在此数据对象中添加一些限制查询,仅"从测量中加载TOP 1*"?



1> Lars Truijen..:

您可以使用TADOQuery来限制sql查询的结果集.或者您可以使用TADOTable并将CursorLocation设置为服务器端游标,以防止客户端将完整的结果集加载到内存中.



2> Fabricio Ara..:

您可以将该adoTable与Server OpenForwardOnly游标和TCLientDataset一起使用,并将PacketRecords设置为非零值.当我不得不编写一个应用程序,以自定义的方式将数据从MSSQL泵送到Oracle时,工作得非常好,其中包含数百万条记录的表.

编辑 - >这将是这样的:

procedure ConfigCDSFromAdoQuery(p_ADOQ: TADOQuery; p_CDS: TClientDataset; p_Prov: TDatasetProvider);
begin
  If p_ADOQ.Active then p_ADOQ.Close;
  p_ADOQ.CursorLocation := clServer;
  p_ADOQ.CursorType := ctOpenForwardOnly;
  p_Prov.Dataset := p_ADOQ;
  p_CDS.SetProvider(p_Prov);
  p_CDS.PacketRecords := 100;
  p_CDS.Open; 
end ;

我已经通过代码完成了所有这些,但大多数情况下你可以在设计时完成.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有