我不是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*"?
您可以使用TADOQuery来限制sql查询的结果集.或者您可以使用TADOTable并将CursorLocation设置为服务器端游标,以防止客户端将完整的结果集加载到内存中.
您可以将该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 ;
我已经通过代码完成了所有这些,但大多数情况下你可以在设计时完成.