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

问题描述 投票:7回答:7

我不是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 *”?

delphi ado
7个回答
10
投票

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


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 ;

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


1
投票

本文特定于BDE,但适用于ADO或大多数客户端数据访问库。

http://dn.codegear.com/article/28160

我建议使用TADODataSet(它比“TADOQuery”更接近ADO层)并通过提供自定义搜索表单(日期范围,特定项目列表等)仅选择客户端所需的数据

祝好运


0
投票
  1. 在“MeasurementsADOTable”当前所在的数据模块上,删除一个TADOQuery并将其命名为“MeasurementsADOQuery”
  2. 将MeasurementsADOQuery的Connection属性设置为MyADOConnection(假设这是基于提供的小代码片段的情况。)
  3. 我还假设您正在显示网格或使用DataSource - 将DataSource组件的“DataSet”属性从MeasurementsADOTable更改为MeasurementsADOQuery
  4. 通过设置MeasurementsADOQuery的SQL属性来编辑要执行的实际查询。 (在打开之前的运行时:Measurements.SQL.Text:='从测量顺序中选择前10 * *)
  5. 分析/更改代码中的所有引用,从MeasurementsADOTable到MeasurementsADOQuery

0
投票

不要在启动时使adotable处于活动状态并在以后将其设置为true是一种方式,但仍然无法提供帮助....使用adodataset并在运行时使用连接文本填充它。只检索相关数据,使其更快。


0
投票

使用adoquery如果你不需要任何行,只想插入新行,请使用sql命令,例如'select * from myTable where id = -1'因为Id是自动编号,所以不返回任何行。或'select * from myTable,其中1 = -1'但我认为这不是Insering数据的好方法。使用adocommand肯定要好得多。

如果你想要X行'从myTable选择顶部X *'


-1
投票

我发现ADO + Access w / Delphi很慢,很多东西(大表读取就像你在描述,但也插入等)。我的回答是“完全放弃使用ADO和Access”。 从来没有理解为什么它表现如此糟糕,特别是当早期的技术似乎没有。

© www.soinside.com 2019 - 2024. All rights reserved.