我不是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 ;
我已经通过代码完成了所有这些,但大多数情况下你可以在设计时完成。
本文特定于BDE,但适用于ADO或大多数客户端数据访问库。
http://dn.codegear.com/article/28160
我建议使用TADODataSet(它比“TADOQuery”更接近ADO层)并通过提供自定义搜索表单(日期范围,特定项目列表等)仅选择客户端所需的数据
祝好运
不要在启动时使adotable处于活动状态并在以后将其设置为true是一种方式,但仍然无法提供帮助....使用adodataset并在运行时使用连接文本填充它。只检索相关数据,使其更快。
使用adoquery如果你不需要任何行,只想插入新行,请使用sql命令,例如'select * from myTable where id = -1'因为Id是自动编号,所以不返回任何行。或'select * from myTable,其中1 = -1'但我认为这不是Insering数据的好方法。使用adocommand肯定要好得多。
如果你想要X行'从myTable选择顶部X *'
我发现ADO + Access w / Delphi很慢,很多东西(大表读取就像你在描述,但也插入等)。我的回答是“完全放弃使用ADO和Access”。 从来没有理解为什么它表现如此糟糕,特别是当早期的技术似乎没有。