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

And*_*ndy 7 delphi ado

我不是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;                  
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lar*_*ens 10

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


Fab*_*ujo 5

您可以将该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 ;
Run Code Online (Sandbox Code Playgroud)

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