8

我不是 Delphi 程序员,但我有一个旧的 Delphi 7 应用程序,我需要修复它,它正在使用 ADO。

数据库表(MS Accesss)包含 +100,000 行,当我设置 ADOTable.Active=true 时,它​​开始将整个表加载到 RAM 中,这需要大量内存和时间。

如何防止 ADO 加载整个表?我试图设置 MaxRecords 但它没有帮助。

基本上我们所做的就是 att 程序启动:

// 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 *”?

4

7 回答 7

10

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

于 2008-12-05T12:00:27.787 回答
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 ;

我已经通过代码完成了这一切,但大部分你可以在设计时完成。

于 2008-12-10T16:34:36.000 回答
1

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

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

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

祝你好运

于 2008-12-13T10:58:27.257 回答
0
  1. 在“MeasurementsADOTable”当前所在的数据模块上,删除一个 TADOQuery 并将其命名为“MeasurementsADOQuery”
  2. 将 MeasurementsADOQuery 的 Connection 属性设置为 MyADOConnection(假设这是基于提供的小代码片段的情况。)
  3. 我还假设您正在显示网格或以其他方式使用 DataSource - 将 DataSource 组件的“DataSet”属性从 MeasurementsADOTable 更改为 MeasurementsADOQuery
  4. 通过设置 MeasurementsADOQuery 的 SQL 属性来编辑要执行的实际查询。(在打开前的运行时:Measurements.SQL.Text := 'select top 10 * from measurement order by whatever')
  5. 分析/将代码中的所有引用从 MeasurementsADOTable 更改为 MeasurementsADOQuery
于 2008-12-07T22:00:12.007 回答
0

不要在启动时使 adotable 处于活动状态,稍后将其变为 true 是一种方法,但仍然没有真正的帮助....使用 adodataset 并在运行时根据需要使用连接文本填充它。只会检索相关数据,使其更快。

于 2012-10-25T18:05:06.810 回答
0

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

如果你想要 X 行 'select top X * from myTable'

于 2017-12-30T11:19:58.283 回答
-1

我发现 ADO + Access w/Delphi 在很多事情上都非常缓慢(大表读取就像您所描述的那样,但也插入等)。我的回答变成了“完全停止使用 ADO 和 Access”。

从来不明白为什么它的表现如此糟糕,尤其是当早期的技术似乎不是这样的时候。

于 2008-12-13T10:06:33.133 回答