什么样的异常可以扩散到OnPostError?(50分)

  • 主题发起人 主题发起人 tsp
  • 开始时间 开始时间
T

tsp

Unregistered / Unconfirmed
GUEST, unregistred user!
  为了避免主键值冲突,一个最简捷的(同时也是最有效的)方法是在
OnPostError中判断EDBEngineError是否为DBIERR_KEYVIOL,若是,则
对用户给出提示,同时置Action为daAbort(避免异常同时给出一个提示)。
  由于Post时往往不只是要判断键值冲突,还要判断诸如某几个字段不
能为空,某几个字段必须符合一定的条件等,因此,我想把这些判断都放
到BeforePost过程中,如果某字段为空,则主动发出DBIERR_FIELDISBLANK
异常,其它不符合条件的发出相应类别的异常,我希望将对异常的处理放到
OnPostError中,以设置Action为daAbort的方式将Post过程终止。
  但事实上程序完全没有按照我希望的方式执行,除了键值冲突外(在
BeforePost过程中没作任何判断),其它所有主动发出的异常只是简单地
由系统给出了一个提示,然后接下去正常执行,根本没有将异常传递到
OnPostError中。
  书上讲,Raise 发出地只是异常的实例,当时建立,处理完后自动释
放,除非再次发出Raise,但也仅仅局限在该过程的Try...Except... 块
中,不会扩散到外部去,而在BeforePost中又没有类似OnPostError中的
Action可以设置。
  现在有这样一个问题,如果要放在OnPostError 中处理,如何将异常
扩散过去;如果放在BeforePost中通过再次启动异常来处理,如何将Post
事件终止?
  我还做过这样一个试验,将某字段设为Required,编辑时将该字段设
为空,撇开BeforePost过程(即不写该过程),保存时直接将它交给
OnPostError处理,但系统似乎并不认为它是一个Error,除了给出一个
“该字段要求赋值”的提示外,并不进入OnPostError过程,这是为什么
呢?
  请各位专家解答!前提是采用以上两种方法之一。
 
推荐用 RUL/TRIGGER来完成类似功能
 
tsp,eRequiredFieldMissing是可以在onpostError中截获的,最好的例子
delphi已经给你了,在Demo下db/dberrors/
其中dm1.ordersPostError
最近几天我还写了关于RequiredFieldMissing的程序,也是好的,我用的是
paradox&Interbase.
 
其实, OnPostError 是在数据真正提交到数据库端时, 数据库发生
异常时才触发OnPostError事件, 如果你将某字段指定为Required,
则Delphi 会在客户端直接判断Field的Required的值, 如果True ,
而没值时, 直接提示错误. 下面简单的描述Delphi 的Post 过程
先BeforePost -> 检查TFields定义的约束条件-> Post ->
if noerror then
afterPost
else
OnPostError ;

若想全部在OnPostError中进行错误处理, 要将程序中Dataset中
Fields[*].Required := false; 这样
Delphi的客户端就不会进行约束检查.
例如 ID 字段在数据库中是非空值, 而在
程序中Fields['ID'].Required := false ;
Post时,ID没有赋值,会触发OnPostError过程,产生DBIERR_FIELDISBLANK错误.
 
可以结束了.
 
多人接受答案了。
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部