2008-12-05 98 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的'

相關問題