2016-12-16 50 views
1

我有一個數據庫〜50000行和16列(至少現在)。當在應用程序的主窗體中按下按鈕時,程序會進行一些計算,從中計算結果。我需要將當前的表格記錄作爲計算結果。在數據庫表中快速定位

示例:我的結果是35500.我需要將表格中的記錄編號設置爲35500。我怎樣才能以一種快速的方式實現這一點? 我用ADO(無SQL)工作,我已經指示試圖像

table.First; 
table.MoveBy(35500); 

但它們對於這種情況下很慢。我還必須提到,定位在TDBGrid或其他任何組件中沒有任何輸出的情況下完成,因此它必須是更快的方式

+0

可能是因爲你問微軟ADO司機做35500「移動下一個記錄」操作,此起彼伏。如果你確實需要ISAM操作而不是SQL(但是爲什麼???),也許你會用一些Delphi本地引擎(tdbf.sf.net,nexusDB或Torry.net中的任何東西)獲得更多的運氣,在那裏你可以做一些像'DataSetObject.RecNo:= 12345;'? –

+1

使用ClientDataSet – FLICKER

+0

@FLICKER:實際上,對於OP在數據庫服務器上提到的表的大小,ADO比TClientDataSet快得多,特別是在檢索階段。 – MartynA

回答

3

我知道你說沒有連接到數據集的db-aware控件,但你有沒有試過比較時間去做MoveBy(50000)有沒有被.DisableControls.EnableControls的呼叫包圍?您可能會認爲沒有任何db-aware組件,使用.DisableControls.EnableControls或不會產生影響,但事實上它確實如此。

在我的系統,做一個MoveBy(50000)對SQL Server(2014)採用19+ 秒無.DisableControls.EnableControls和0.2秒,這是一個巨大的差異。

我想我的回答這個以前q可以爲相關:Why does scrolling through ADOTable get slower and slower?

順便說一句,MoveBy()主要是有用的時候會到你想要的行的最佳方式,可以通過其Distance參數來表示。作爲由克里斯汀·羅斯評論指出,如果你知道你想要移動到該行中的一個或多個字段的值,它可以更快地使用布爾Locate功能,如

if AdoQuery1.Locate('CountryCode', 'US', []) then 

Locate允許您指定幾個字段,以匹配在

if AdoQuery1.Locate('CountryCode;Surname', VarArrayOf(['US', 'Smith']), []) then 
+0

謝謝你的幫助! –

+0

當你知道該字段和內容時,你可以使用「定位」,它使用索引 –