提问所有高手!!!怎么解决这个最容易出错,但最不容易发现的ADO问题!!!!!!!!!!!!!!

hellowbh 2004-10-22 10:38:42
大家可以试试:
如下三个存储过程:
create procedure sp_a
as
exec sp_b
go
create procedure sp_b
as
exec sp_c
go
create procedure sp_c
as
raiserror 50002 '如果你能看到我,说明你捕获到了我的错误'
go
然后你在Delphi里面
try
adoQuery1.SQL.Text:=' exec sp_a ';
showMessage('哈哈,执行成功');
except
on e:Exception do
showmessage(E.Message);
end;

大家试试能否捕获错误!!

我发现,只要存储过程调用了存储过程,或触发器又调用了存储过程,或者又触发了触发器,那么在以后的存储过程中如果有错误发生,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吧?
大家有什么好的办法?


是不是合理的解决方法是修改 ADOQuery.ExecSQL 源码,使之本身具有检测 adoConnnetion.Errors得功能 如果有errors发生,就raise exception,好让delphi知道有错误发生了。 这样传统的try except也能捕获这种错误了。
...全文
230 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellowbh 2004-10-27
  • 打赏
  • 举报
回复
想知道答案的顶啊
tonylk 2004-10-25
  • 打赏
  • 举报
回复
up
hellowbh 2004-10-25
  • 打赏
  • 举报
回复
u p a
star_Qin 2004-10-25
  • 打赏
  • 举报
回复
ding
hellowbh 2004-10-25
  • 打赏
  • 举报
回复
ADO 把 Raiserror 的信息放在了 Adoconnection.Errors里面了。
delphi直接调用 sp_c 可以捕获错误信息。但一旦隔了一层或者两层之后就直接捕获不到了。
alphax 2004-10-25
  • 打赏
  • 举报
回复
不熟sqlserver,如果真的有这回事就直接改源码咯,也没什么的
有点怀疑是否真的有这么回事,那样的话,raiserror岂不是变成了摆设?
lucky8star 2004-10-25
  • 打赏
  • 举报
回复
up a
hellowbh 2004-10-25
  • 打赏
  • 举报
回复
u p a
amitabha 2004-10-22
  • 打赏
  • 举报
回复
gz
wycg_cnh20 2004-10-22
  • 打赏
  • 举报
回复
你可以ADOStoredProc空间,把错误作为返回参数
hellowbh 2004-10-22
  • 打赏
  • 举报
回复
想知道解决办法得顶啊
知道解决办法的说啊
hellowbh 2004-10-22
  • 打赏
  • 举报
回复
大家帮忙 up 啊。
wenjianyao 2004-10-22
  • 打赏
  • 举报
回复
换关于存储过程的控件
hellowbh 2004-10-22
  • 打赏
  • 举报
回复
但是假如是触发器触发触发器呢? 触发器怎么检测返回值?

2,507

社区成员

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

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