2016-12-16 148 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

当你知道该字段和内容时,你可以使用“定位”,它使用索引 –