2008-12-05 34 views
6

我不是一个Delphi程序员,但我有一个旧的Delphi 7应用程序,我需要修复它并使用ADO。如何防止Delphi 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;     

设置生效后=真它开始加载整个测量到RAM中,需要时间!

我们使用MSDASQL.1提供程序。也许它不支持MaxRecords属性?

如何在此数据对象中添加一些限制查询以仅从测量中加载TOP 1 *?

回答

10

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

0
  1. 在您的数据模块,其中“MeasurementsADOTable”目前居住,落个TADOQuery并将其命名为“MeasurementsADOQuery”
  2. 设置MeasurementsADOQuery到MyADOConnection连接属性(假设这是根据所提供的一些代码片段的情况。 )
  3. 我也假设你是显示一个网格或以其它方式使用数据源 - 数据源组件的“数据集”财产MeasurementsADOTable改变MeasurementsADOQuery
  4. 编辑实际查询通过设置MeasurementsADOQuery的SQL财产被执行。 (在开放前运行时间:Measurements.SQL.Text:=“选择顶部10 *从测量为了通过任何”)
  5. 分析/改变从MeasurementsADOTable代码中的所有引用MeasurementsADOQuery
5

你可以使用adoTable与服务器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 ; 

我所有的代码做了,但大多数的,你可以在设计时做的。

+0

我怎么跟我MSACCESS连接的TClientdataSet?你有一些你可以分享的示例代码吗? – Vlad 2012-10-26 17:45:04

+1

@Vlad:过程总是相同的:将TClientDataset(CDS)与TDatasetProvider(DSP)连接起来,然后将属性DSP.DataSet属性指向您要带入数据的ADOQuery。在About.com上的Delphi部分,你可以找到成千上万的例子,也可以在embarcadero docwiki上找到。 – 2012-10-26 18:23:01

-1

我发现ADO + Access w/Delphi对于很多事情来说太痛苦了(大表读取像你描述的那样,但也插入了,等等)。我的答案变成了“完全使用ADO和Access”。

从来没有理解为什么它表现如此糟糕,尤其是当早期的技术似乎没有。

1

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

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

我会建议使用TADODataSet(它的“接近” ADO层比TADOQuery),只选择客户需要提供定制的搜索表单(日期范围,具体的产品清单等数据)

好运

0

不要让adotable活跃在启动时,使之真正后来是一种方式,但还没有真正要去帮助....使用adodataset,并与您的网络连接在运行时根据需要填充,与其文本。只有相关的数据将被检索,使其更快。

0

使用adoquery 如果您不需要任何行,只是想这样 插入新行使用SQL命令“SELECT * FROM myTable的其中id = -1” 由于Id为自动编号没有行返回。 或 'select * from myTable where 1 = -1' 但我认为这不是用于Insering数据的好方法。使用adocommand肯定好多了。如果你想X行

'从选择顶部X * myTable的'

相关问题