我不是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 *”?
答案 0 :(得分:10)
您可以使用TADOQuery通过sql查询限制结果集。或者您可以使用TADOTable并将CursorLocation设置为服务器端游标,以防止客户端将完整的结果集加载到内存中。
答案 1 :(得分:5)
您可以将该adoTable与服务器OpenForwardOnly游标一起使用 将PacketRecords设置为非零值的TCLientDataset。工作 当我不得不编写一个应用程序来从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 ;
我已经通过代码完成了所有这些,但大多数情况下你可以在设计时完成。
答案 2 :(得分:1)
本文特定于BDE,但适用于ADO或大多数客户端数据访问库。
http://dn.codegear.com/article/28160
我建议使用TADODataSet(它比“TADOQuery”更接近ADO层)并通过提供自定义搜索表单(日期范围,特定项目列表等)仅选择客户需要的数据
祝你好运答案 3 :(得分:0)
答案 4 :(得分:0)
不要在启动时使adotable处于活动状态并在以后将其设置为true是一种方式,但仍然无法提供帮助....使用adodataset并在运行时使用连接文本填充该内容。只检索相关数据,使其更快。
答案 5 :(得分:0)
使用adoquery 如果你不需要任何行,只想插入新行,请使用sql命令 '从myTable中选择*,其中id = -1' 由于Id是自动编号,因此不会返回任何行。 要么 '从myTable中选择*,其中1 = -1' 但我认为这对Insering数据来说并不好。使用adocommand肯定会好得多。
如果你想要X行 '从myTable'
中选择前X *答案 6 :(得分:-1)
我发现ADO + Access w / Delphi很慢,很多东西(大表读取就像你在描述,但也插入等)。我的回答是“完全放弃使用ADO和Access”。
从来没有理解为什么表现如此糟糕,特别是在早期的技术似乎没有这种情况时。