求助:存储过程插入重复键错误为何未能捕获

weishigao 2013-07-31 11:54:45
各位高手,我在delphi中用ado执行存储过程,代码简化如下:
try
con1.BeginTrans;
aq1.SQL.Text:='exec test';
aq1.ExecSQL;
con1.CommitTrans;
ShowMessage('成功!');
except
ShowMessage('错误!');
con1.RollbackTrans;
end;

存储过程如下:
CREATE PROCEDURE test AS
SET XACT_ABORT ON
update duowdkc set kucsl=kucsl+10
insert into yewdj(danjbh) values ('JHD001201307300011')

现在的问题是,该存储过程中第一句执行成功,第二句失败,因为插入了重复键导致回滚了。
那么在我的delphi里,是捕获不到回滚的,程序依然显示“成功”。
另外,如果我把第一句去掉,只留第二句,那么错误就捕获到了。
到底应该怎么办?是存储过程的问题还是delphi的问题,我需要改哪里?

...全文
169 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weishigao 2013-07-31
  • 打赏
  • 举报
回复
追问一下,应该避免出现键号值重复的情况。 而且应该是在提交之间预先就判断的,而不是在保存时才发现报错。 可以通过一个存储过程求不重复的键值。存储过程内,用事务提交和回滚,来控制并发读取。 ============================================== 通过一个存储过程求不重复的键值,握手,我就是这样做的。 我贴出来的这个只是个测试性的代码段,我是要测试当存储过程中产生了错误后delphi的捕获,所以故意给插入的重复键来试验。 最后还是非常感谢,给分了。
  • 打赏
  • 举报
回复
追问一下,应该避免出现键号值重复的情况。 而且应该是在提交之间预先就判断的,而不是在保存时才发现报错。 可以通过一个存储过程求不重复的键值。存储过程内,用事务提交和回滚,来控制并发读取。
weishigao 2013-07-31
  • 打赏
  • 举报
回复
返回错误号这种办法,我知道。但是那样的话就看不到系统自动生成的错误信息了。 我是想把错误消息捕获到并通过delphi的except反馈给用户。 我现在已经找到原因了,因为当存储过程中有多条语句时,默认会返回每一句所影响的行数,这样如果第一条成功了,那么delphi那边就认为成功了,后面的行产生的错误好像是被忽略了! 现在,我在存储过程里加上“Set NOCOUNT ON”,终于搞定了!
  • 打赏
  • 举报
回复
楼主给分吧,再查查资料吧。
  • 打赏
  • 举报
回复
CREATE  Procedure up
           @sYM     varchar(50),
           @sResult int Out --返回结果(1成功,其他失败)
As

       IF @@ERROR =0 select @sResult =1
       else          select @sResult =0
GO
       DMMain.DoOpenQuery(Qrytmp, 
               'declare @sErr Varchar(255) declare @sResult int exec ' +Sp +' '
              +''''+YMonth +''',''' +StoreID +''',@sErr out, @sResult out '
              +' select @sErr as Err, @sResult as Result');

         Rlt :=FieldByName('result').asinteger;
         Err :=fieldbyname('Err').Asstring;

         if Rlt =0 then begin 
            Msg(Err +'!',self.Handle, 0); Free; St_SID.Free; exit; 
        end;
地狱圣者 2013-07-31
  • 打赏
  • 举报
回复
存储过程里的异常最好内部能捕获,并输出异常。

2,507

社区成员

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

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