有关ADO错误捕获:用 try except 捕获不到的问题解决方法

hellowbh 2004-10-21 02:04:10
如下代码

try
adoQuery1.SQL.Text:='update tb1 set tb1.Filed1=100 where .... ';
except
showMessage('错误');
end;

如果执行该操作触发了触发器1,触发器1中又调用了存储过程1,那么在存储过程中如果有错误发生。(最简单的,只写一个 raiserror 50002 '出错啦') ,delphi中是捕获不到这种错误的。
只能用 adoQuery1.Connection.Erros.count>0知道发生了错误。


但这样的话,我总不能每执行一条SQL语句,就检查一下adoConnection.Errors,岂不是太麻烦了?
(如果不检查的话太不可靠了,谁知道表里面都有什么触发器,触发器又触发或者调用其他存储过程)


并且我还发现:

conn1.begintrans;
try
qry1.sql.text:='...';
qry1.execsql;
qry2.sql.text:='...';
qry2.execsql;
if conn1.Errors.count>0 then
conn1.rollbacktrans
else
conn1.committrans;
except
conn1.rollbacktrans;
end;

假设在执行 Qry1.execSQL中发生错误,而这个错误是隔了一级(计触发器触发了另外的触发器或调用了其他存储过程中出的错),那么try except是捕获不到的,而之后又执行了Qry2.ExecSQL,而执行该操作没有错误发生。那么现在检测conn1.Errors.count已经是零了。 最终的结果是Qry1执行失败,自动回滚,而Qry2执行成功,最后提交。造成数据不一致。


但我总不能每次执行一个SQL语句,就检查一下conn1.Errors.count吧?
大家有什么好的办法?
...全文
311 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellowbh 2004-10-21
  • 打赏
  • 举报
回复
哪位高手给解决一下?
hellowbh 2004-10-21
  • 打赏
  • 举报
回复
是不是合理的解决方法是修改 ADOQuery.ExecSQL 源码,使之本身具有检测 adoConnnetion.Errors得功能
如果有errors发生,就raise exception,好让delphi知道有错误发生了。 这样传统的try except也能捕获这种错误了。
hellowbh 2004-10-21
  • 打赏
  • 举报
回复
如果 try except 能捕获。
我就可以

conn1.begintrans;
try
qry1.execsql...
...

...
做无数数据库操作

conn1.committrans;
except
conn1.rollbacktrans;
end;


但现在好多错误是用try except 捕获不到的。并且每执行一个操作,会重新给AdoConnection.Errors赋值,所以还必须每执行一步就得检测一次AdoConnection.Errors
brallow 2004-10-21
  • 打赏
  • 举报
回复
顶吧。哈哈。。。。
我想有一个 问题:即使你不能每次都判断Error.count,也需要判断一下 执行的情况吧?
墨梅无痕 2004-10-21
  • 打赏
  • 举报
回复
关注……
hellowbh 2004-10-21
  • 打赏
  • 举报
回复
谢谢顶的兄弟
GoldShield 2004-10-21
  • 打赏
  • 举报
回复
?
hellowbh 2004-10-21
  • 打赏
  • 举报
回复
没人关心吗? 帮忙顶也行啊。知道解决办法后对大家都有好处的。

2,507

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧