在数据库中有如下两张表:
CREATE TABLE t1 (a int PRIMARY KEY)CREATE TABLE t2 (a int REFERENCES t1(a))INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)我有个存储过程如下:
create procedure sp_add
asSET XACT_ABORT ONINSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
在前台的BUTTON1中有如下代码:    ADOConnection1.BeginTrans;
    try
      ADOSp_InsertData.ExecProc;
      showmessage('成功添加数据!');
    except
      ADOConnection1.RollbackTrans;
      showmessage('在往服务器传输数据时出错');
    end;
当点击BUTTON1之后,但sp_add这个存储过程虽然有回滚,但并没有弹出:
'在往服务器传输数据时出错'的提示,而是出现了"成功添加数据"的提示,请问当添加数据出现错误时,数据回滚的同时,怎样才能出现'在往服务器传输数据时出错'的提示呢?
谢谢!

解决方案 »

  1.   

    关键还是看你存储过程里面怎么写的。我觉得。好像在存储过程里面没有RAISERROR 抛错的话。DELPHI是抓不到错误的。
    你可以用ADOConnection.ERRORS 来抓判断一下。貌似。~~~
      

  2.   

    请教了一个高手:可以按如下方法解决:
    drop procedure sp_add
    goCREATE procedure sp_add
    asDECLARE @ins_error int
    set @ins_error=0--SET XACT_ABORT ON /*要设为OFF,如果设为ON,即使出错,@@error仍然为0,因为事务会自动回滚,就不存在出错*/
    BEGIN TRANINSERT INTO t2 VALUES (1)
    if @@error<>0
     select @ins_error=1INSERT INTO t2 VALUES (2) /* Foreign key error */
    if @@error<>0
     select @ins_error=2INSERT INTO t2 VALUES (3)
    if @@error<>0
     select @ins_error=3if @ins_error=0
      commit tran
    else
    begin
       ROLLBACK TRAN
       RETURN(@ins_error) /*采用存贮过程自身返回值来判断*/
    endGODELPHI的代码如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      myResult,mid : Integer;
    begin
        ADOStoredProc1.ExecProc;
        mid := ADOStoredProc1.Parameters.ParamValues['@RETURN_VALUE'];
        showmessage(inttostr(mid));
        if mid=0 then
        showmessage('成功添加数据!')
        else
        Showmessage('在往服务器传输数据时出错');
    end;
      

  3.   

    同时谢谢 tetsuya(小哲) 的帮忙!