create  PROCEDURE dbo.FDLck_zh_SaveCK
( --保存数据[RdRecord 收发记录主表]
@ID as int,
--[收发记录子表 RdRecords]
@AutoID as int,             --表ID
)
AS BEGIN
   BEGIN TRAN--开始事务
        
--[收发主表操作]
INSERT INTO RdRecord(
[ID], *)
VALUES(
@ID,*)



INSERT INTO RdRecords(
[AutoID], *)
VALUES(
@AutoID,*)
update ......     --出错处理
     IF (@@error!=0)
         BEGIN
             --RAISERROR 20000 'AddICStockBill: Cannot insert data into  AddICStockBill '--向应用程序抛出错误  RAISERROR ('error!', 16, 1)                     ROLLBACK TRAN--回滚事务
             Return (1)--设置返回值
         End
     COMMIT TRAN--如果没有错误则提交事务
END
以上是 一个事务存储过程,里面包含有二条插入语句和一条修改语句,在执行存储过程中遇到以下两个问题,请高手解决!
1、如何保证三条语句能执行成功,不成功回滚。我的程序中由于是二开程序,与原程序插入的语句,会出现@ID重复,而出现第一条插入不成功,@AutoID插入成功,我在取ID时也 用 with(uplock)来进行锁定。不知道如何会出现一条执行成功,一条不成功的现象;
2、当执行不成功,如何将SQL返回值返回给我的程序,我是用VB+SQL开发。请高手指教!

解决方案 »

  1.   

    当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。http://blog.csdn.net/cxzhq2002/archive/2009/07/31/4396558.aspx
      

  2.   

    VB程序端执行sql出错抓取到的err.description就是sql server返回的错误。
      

  3.   

    非常感谢楼上的兄弟!
    第一个问题已解决,
    第二个问题,我如何在VB中获取到RAISERROR 返回的信息呢?
      

  4.   

    看到很多方法,我也用了 on error goto f_error: 之类的,但获取不到,郁闷!
      

  5.   

    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GOALTER  PROCEDURE test(@vs1 as nvarchar(50),@vs2 as nvarchar(50))
    as
    begin
    SET XACT_ABORT ON
    BEGIN TRAN




    insert into T1(ID,Vs)values(@vs1,'a')
    insert into T1(ID,Vs)values(@vs2,'a')
    --select * from T1
    IF (@@error!=0)
        BEGIN
       select * from T1

       RAISERROR ('error!', 16, 1)   
       ROLLBACK TRAN  --回滚事务  
        End
        
        COMMIT TRAN  --如果没有错误则提交事务

    end
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO==============================================================
    VB代码:
             On Error GoTo f_error
            
            Dim txtsql As String
            Dim mrc As ADODB.Recordset
            Dim gconn As New ADODB.Connection
            gconn.ConnectionString = Adodc1.ConnectionString
            gconn.CursorLocation = adUseClient
            gconn.Open
        
            
            txtsql = "execute test @Vs1='11',@vs2='11'"
            gconn.Execute (txtsql)
            
            Exit Sub
    f_error:
            MsgBox "错误码:" & Err.Number & Chr(13) & Err.Source & ":" & Err.Description, vbExclamation, "提示"
            Me.MousePointer = 0
    =====================================================================第一参数执行的插入语句错误,会捕捉到错误提示,第一参数执行的插入语句正确,不会提示?是为何?高手指导
      

  6.   

    如果用SET XACT_ABORT ON可能捕捉不到错误不要使用SET XACT_ABORT ON
    然后每一个i u d都要用@@error判断判断,如:
    declare @err int
    set @err=0
    begin tran
    insert into ...
    set @err=@err+@@error
    update ....
    set @err=@err+@@error
    delete ...
    set @err=@err+@@errorif @err<>0 
    rollback tran
    else
    commit tran另外如果需要返回文字,可以给存储过程加一个output参数。