如下代码 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吧?
大家有什么好的办法?
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吧?
大家有什么好的办法?
解决方案 »
- PROJECT MANAGER同时管理两个项目时,不会有干扰吗
- COM高手跑来看啊!
- 管他什么工具,能骗钱就是好工具。现在一直用Delphi
- 求救:我用TServerSocket和ClientSocket做个一个文件发送程序,老有错误,大家进来看看
- 用Delphi做Auto CAD功能
- 如何用DBCombobox获取表的某一属性的所有字段
- DELPHI 7 和 DELPHI .NET 一样吗?
- 一星期来的问题?
- delphi的各位朋友,现在做一个多媒体教学软件用什么工具好
- 幸幸苦苦开发了两个月,竟然拿不到工资,大家有什么感想?
- QRDBEdit中组建如何让里面的字句中对齐啊?
- 金山毒霸 6 这个文件夹是怎么做的,为什么不能删除啊!琢磨好久了,就是不知道是怎么做到的!
我想有一个 问题:即使你不能每次都判断Error.count,也需要判断一下 执行的情况吧?
我就可以
conn1.begintrans;
try
qry1.execsql...
... ...
做无数数据库操作 conn1.committrans;
except
conn1.rollbacktrans;
end;
但现在好多错误是用try except 捕获不到的。并且每执行一个操作,会重新给AdoConnection.Errors赋值,所以还必须每执行一步就得检测一次AdoConnection.Errors
如果有errors发生,就raise exception,好让delphi知道有错误发生了。 这样传统的try except也能捕获这种错误了。