关于数据库查找的问题(100分)

  • 主题发起人 waterfish
  • 开始时间
W

waterfish

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位高手:在Locate或Find等命令可以定位记录,但是如果符合条件的记
录不止一条,locate也只能找到符合记录中的首条记录,如何找到下一条或者下
几条记录呢?请教请教
 
我解决这种问题的办法:或者用TQuery,或者动态生成个Table,把条件写到
Filter属性里,令Filtered为True。虽然这法子有点土,但很管用。

如果哪位有更好的解决方法,还望不吝赐教。
 
报歉得很,这个回答实在不能接受。我要做的不是选出合适的记录,而是定位合适的
记录。
 
呵呵,其实我也不满意这个解决办法啊。

我现在的方法就是用TQuery或设置了Filter的TTable选出的符合条件的
记录,然后从头到尾过一遍,如果要定位到某条记录,就取得它的关键字,
再跑到要进行定位的Table里去FindKey。

唉,真土,真土。
 
对于海量数据库,这样做的效率可以说是低得可怕了
 
对于数据量大的数据库(记录多或单条记录信息量大),我一般是做两次查询,第一先查出满足条件的记录的键值和其它一、两个要用到的字段(这个TQuery的field个数不能多),在此TQuery中循环,定位每一条记录,再用键值做第二次查询,查出所有字段内容。
 
李京的做法和我是一样的,除此之外我真想不出更好发办法了。
 
可不可以从BDE API着手去想办法呢?
 
若你打开了索引文件,用Next方法可找到你要找的.
 
索引文件将限制了将要成为查找的字段
我看关于locate或lookup的说明,说执行了以后会生成filter不知道是什么意思
 
其实Delphi实现Locate和Find的操作也是要利用filter的,利用filter和使用SQL
中的SELECT语句进行查询的方式较为相似,也就是说是比较规范的查询方式.至于速度
问题,我认为不是要考虑的主要问题,理由是:1.如果你是通过Borland的BDE直接操作
Table的话,BDE已经运用了类似于Micorsoft在Foxpro中使用的Rushmore技术.
2.若只是用Delphi开发C/S模式下的客户程序,就和用SELECT语句实现的查询一样,
速度取决与你所用的数据库管理系统和你的网络系统.
顺便说一句,使用Delphi进行数据库应用的开发应该把原来在Foxpro和dBASE下的
一些观念和方式彻底抛弃.
 
谢谢johson,这个功能主要是我们的上司见到某些软件上有,所以才让我们去搞的,
所以,我们也不清楚那到底是否在delphi的标准控件上做出来的。所以试着想想办法
看看可否解决
 
Hi WaterFish,
I wonder which water you come from, sea, lake or a pound?

Sunset 和 Johson 的方法都是很实际可用的方法, 要想连续的定位记录不用filter
or query 是不行的. 我看你可以将他们两个的建议结合起来, 做一个 query 只包
含定位有关的字段放在一旁当作你的 table 定位的索引. 然后用 findkey 去定位
table 中的记录. 如果你用 dbgrid 显示 table 的话, 你就可以实现在数据表中上
下跳跃式的定位了.
 
我的经验是:如果数据量大,尽量不要用Ttable,因为它的运
行效率低,如果你的需求就是查找显示,用两个TQuery实
现;如果还需要编辑,尽量不用DB控件,如果一定要用,建
议在后台多建一个表,做为临时存放数据用。不要使用Ttable
直接录入数据,数据量一大(几千条以上),速度会很慢。用
Ttable去定位数据,虽然程序简单,但综合考虑速度慢,所以
也建议不要用。
 
李京,很感谢您对此问题的回答,但我还有些问题不解。
如果不用db控件还可以有什么方法编辑数据库?您说的那一临时库是指存放查询结果的
吗?我使用的数据库是oracle,我在程序里已经尽可能使用TQuery代替Ttable了,有
编辑操作的则使用cacheupdate,这样在大程序量的时候也会很慢吗?
 
用普通控件,然后用TQuery或TStoreProcedure,往后台写数
据,而cacheupdate更应该少用,因为使用它,实际上将
transaction变大,那么引起的负作用也会加大(写数据库失败
、表锁等等)。我一开始(两年前)也是使用数据库控件的,
那样确实方便,可是编了若干个程序后,我放弃了,而且最近
在网上也看到相同的观点,看来这个体会不是我一个人独有。
我用临时库只是用来编辑的(那也是一年前,我为了图省事想
出的办法,随着应用、后台数据库、表的增加,我也放弃了)
,因为查询不必用临时表,用TQuery可以实现。
最后申明:因为我一直用Sybase和SQL Server做开发,table
的lock方式和oracle有所不同,所以以上意见供参考。
 
您的意思是用StringGrid实现表的显示而不用dbgrid?是吗?这样做可能要写很多代码的啊
 
做为一个用Delphi编写数据库程序的初学者,我还有一个不情之请,可否将您写过
的程序(关于数据库编程的)email给我?我想这样可能对我启发作用。我的email地
址是:sim@163.net.谢谢
 
建造临时表是好方法,在编辑/增加记录时,用临时表存储数据,当用户确认修改以后可以将表的内容加入主数据库,只需要写 BEFOREEDIT/BEFOREINSERT 和 AFTERCANCEL 和 AFTERPOST事件就可以了。
如果要多次定位数据使用李的方法十分不错,用QUERY查找所有符合条件的数据,但是只包含关键字段和所查信息,当需要查看具体数据的时候,用TABLE.FINDKEY方法获得,这样是最高效的!
 
虽然我也有四、五天没上网(工作太忙了),怎么我一直没看
见waterfish的“新贴子”,而且也没收到版主的email通知。
我尽快给你寄去,不过可能不能运行,因为我编的一直是有一
定规模的系统,有很多模块,只能给你一些读写数据库的例子
。其实,方法我已经写得比较清楚了。
 
顶部