小型数据库PARADOX如何快速方便地维护表间的相关性?(100分)

  • 主题发起人 主题发起人 foolishwolf
  • 开始时间 开始时间
F

foolishwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
表1有域x1,表2有域X1
当表1的X1的内容增加、修改、删除时,
表2要做对应的变化。
如何方便地实现呢?
另SQL语句能否同时执行多个动作?
如:
SELECT * FROM X1
SELECT * FROM X2
这两个动作在一个QUERY控件上能实现吗?
 
在连接表1组件的beforeedit,beforedelete,afterInsert事件里
写上相应的处理过程,对表2进行操作。

你可一写
select * from x1,x2
这个操作当然可以在一个query上实现
 
小型数据库没有触发器和存储过程。
这两个问题都需要你的编程完善。
 
可参见本栏目中"如何维护一对多关系":
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=44253
(对不起,懒得搞成连接了)
 
bird,dwwang,希臣:你们好
对bird的答案我想说明两点:
1。如果用户自己变动了数据,那怎么办呢?
2。我提的两个SQL的例子太普通了,如果一个是查询表1
另一个是修改表2,两者间毫无共同,那怎么办?
希臣先生,除了上面的回答,你能给更多的建议吗?
dwwang的回答我正在看,总之谢谢大家。
 
1 用户改变数据自然会触发与那个操作相应的事件,
这不会有问题呀?!
2 如果两个sql语句没有联系你可以分两次写,
执行完一个再执行下一个.不知你这样做的
目的是什么.
再说,sql语句很丰富,功能很强大!很多操作都能用复合语句完成
我也是刚开始学,建议你也研究一下sql语句.

 
笨狼的意思是想知道一次可不可以执行多条SQL语句吧?
当然可以,就这样:
myQuery.SQL.Add(SQL1);
myQuery.SQL.Add(SQL2);
...
myQuery.ExecSQL;

但这样做的问题是你不能返回数据集,
即不能使用Select语句,因为数据结果集
只有一个,不可能容纳多个查询结果。

一般这样做是用来批量插入或修改数据库。
 
bird先生,你好,看来我的语言表述有问题,我指的是用户
用其他的工具直接修改数据库,当程序再次进入时,一般会要考虑什么问题。
dwwang大侠:我进行了测试
sql1:=insert into x1 value('','',..)
sql2:=insert into x1 value('','',..)
然后执行
myQuery.SQL.Add(SQL1);myQuery.SQL.Add(SQL2);
myQuery.ExecSQL;时,程序仍然提示语句错误。请问为什么?
 
我提出这个问题是因为
自己对相关性进行维护时,
如果表1的关键域修改了,此时应该对表2的相关记录
进行修改,但此时如果发生断电,使相关维护操作
没有进行下去,对这种情况怎么处理呢?
另外,当表记录很多时,打开表时速度会很慢,此时
能不能给用户一个进度提示?
相似问题别人已提过,我这里提出来侧重点是快速、方便
谢谢大家。
 
insert into x1 value('','',..),似乎少了一个s
^
应该是insert into x1 values('','',..)
并且这样的语句必须保证字段值与名称和顺序绝对对应,
否则最好用这种句式:
insert into x1 (field1,field2,...) values(value1,value2,..)

对于断电问题,当然应该用Transaction来解决,
但我不知道Delphi文件型数据库的Transaction功能到底如何。

打开表速度很慢?最好从程序结构上找原因。
因为Delphi本身就是带缓冲的,并非一次
把所有数据取入内存,因此表的数据量大
对速度影响应该并非是线性的。
 
多句sql并用要看数据库本身是不是支持, 不是所有数据库都能用多句sql进行批量处
理的.
对于提示, 是一种必须提倡的编程风格. 最简单的办法是显示一句"正在xxxx...".
当然能搞成动态的最好(进度条, 动画...) 但是不可否认, 这增加了编程的难度.
量力而为最好. 不需要把精力都放在这上面, 这毕竟不是需主要考虑的内容.
 
我想可能是ANOTHER EYES说得对,有些数据库不支持多SQL并用,我当前使用的是本地的DB、DBF,怎么试都不行。我当前要做的功能是把某个表中的合乎条件的记录转移到
同结构的另一表中去,我使用TRANSACTION处理本地数据库时,所做的修改、增加、删除等都是马上反映到表上去了,
而不需等到COMMIT,哪位能给个解决实例。
由于所用的表中记录达50万以上,所以控件打开时速度慢,
用户有时以为死机而强制关机,造成问题,ANOTHER EYES
是否指在线程中进行表的打开,而用时钟等来控制显示‘正在打开。。。’,但是要提示已进行的程度,又怎么办呢?
 
动态提示是以牺牲部分性能来达到的. 也就是说你的表打开的时间会更长. 不过用户
感觉不到. (因为动的, 所以会有速度加快了的错觉)

有个很简单, 在table.OnFilterRecorder中变动进度的progress即可, 不过缺点是
没法取到总记录数. 自己大概估计一个(超过最大记录数), hehe. 只要table.open
之后把进度置为100%就行了, 用户不会注意到的.
(只要把table.filtered置为true, 并table.filter='', delphi就会调用OnFilterRecord事件, 每条记录都会调)
 
ANOTHER EYE谢谢。
您只是回答了一部分问题,您能把其他问题也解决掉吗?
 
哪个问题? 关于commit之后才修改的? 把TTable.CachedUpdated置为true试试?
 
即使用CachedUpdated...我认为也无法达到真正的Commit,Rollback...的效果
你只能在编程中下很大的功夫,不要再应该再想改个Property就能达到效果的
了.
 
  Paradox是个实现的不完整的RDBMS, 缺乏维护数据完整性能力。
必须用程序来维护数据的完整性(如按Transaction理论自己做临时表)。
foolishWolf的需求可是Paradox份外之事,如果用户直接修改
数据(如用Database Desktop),就别指望Paradox。

  建议使用Borland的Local Interbase, 你以上的所有需求她都能满足。
如同Paradox,LocalIB同样短小精干,易于维护。同时它还具有像Oracle等
大型RDBMS的许多优秀特性。它的Tigger功能比M$ SQLServer还强。
当然它的价钱也比Paradox要贵.不过工欲善其事,必先利其器!
 
walkdan的意见是对的,最好是换数据库.
如果自己编程实现事务的效果可能降低应用的效率.
 
应该不让用户用其他工具修改:
1、加口令
2、在执行程序时自动输入口令//用户不知道------
用户用DBD修改时会问口令,他不知道,哈哈!
不然换数据库
 
首先谢谢大家,同时表示歉意。我不是忘记了自己的提问,
而是星期一临时出差了,没法上网,我的邮局服务器也坏了,还没有修好,请大家直接有信笺的话直接在话题上粘贴。
1。TTable.CachedUpdated和本地paradox的TRANSACTION 不是一样的意思。
2。做小系统的话,要保证数据快速性、完整性又要保证数据
库不要花费太多的钱,怎么办呢?
3。对数据表而非数据库加口令,DELPHI打开表时能自动
输入吗?
我明天又要出差了,MISS 大家!
 
后退
顶部