2014-01-23 295 views
1

我有存储过程,我在其中有一个事务。错误:ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION

当我与SQL Server Management Studio中执行它没有错误,但是当我用我的C#代码执行它出现以下错误:

The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

的代码是:

CREATE PROCEDURE [dbo].[AddHardDisk] 
    @name nvarchar(50), @brand nvarchar(50), @serial nvarchar(50), @cost float, @seller nvarchar(50),@note nvarchar(1000),@buyDate Date, 
    @size int ,@moneyType nvarchar(50) 

AS 

    DECLARE @addedDeviceID int 

BEGIN TRY 
    BEGIN TRAN 

     insert into Product(Name,Brand,Serial,Cost,Seller,Note,MoneyType,BuyDate) 
     values(@name,@brand,@serial,@cost,@seller,@note,@moneyType,@buyDate) 

     select @addedDeviceID =SCOPE_IDENTITY() 

     insert into HardDisk(ID,size) 
     values(@addedDeviceID,@size) 

     exec DecreaseMoneyFromFund @moneyType,@cost   

    COMMIT   
END TRY 
BEGIN CATCH 

    IF @@TRANCOUNT > 0 
     ROLLBACK 
END CATCH 
+0

你可以发布你的C#代码调用这个存储过程的相关部分吗? DecreaseMoneyFromFund过程也在做什么? – abhi

+0

你能否发布'DecreaseMoneyFromFund'的源代码? –

+0

问题出现在SQL中,而不是C# – wruckie

回答

1

TRAN的范围是你的TRY块,所以在回滚的地方它不存在。切换它:BEGIN TRAN 然后 BEGIN TRY。

回滚必须在事务范围内发生,而不是在它之前或之后。修改后的代码:

CREATE PROCEDURE [dbo].[AddHardDisk] 
    @name nvarchar(50), @brand nvarchar(50), @serial nvarchar(50), @cost float, @seller nvarchar(50),@note nvarchar(1000),@buyDate Date, 
    @size int ,@moneyType nvarchar(50) 

AS 

    DECLARE @addedDeviceID int 

BEGIN TRAN 
    BEGIN TRY 

     insert into Product(Name,Brand,Serial,Cost,Seller,Note,MoneyType,BuyDate) 
     values(@name,@brand,@serial,@cost,@seller,@note,@moneyType,@buyDate) 

     select @addedDeviceID =SCOPE_IDENTITY() 

     insert into HardDisk(ID,size) 
     values(@addedDeviceID,@size) 

     exec DecreaseMoneyFromFund @moneyType,@cost   

     COMMIT   
    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT > 0 
      ROLLBACK 
    END CATCH 
END TRAN 
+0

,你刚刚抽签得更快。但我希望将tran嵌套在我的try/catch中 – wruckie

0

这是我用于Sp的Emply shell。我想你可能会错过'Commit Tran'

BEGIN TRY ; 
    BEGIN TRAN; 
     BEGIN   

--Insert SQL Here 
     END 
IF @@TRANCOUNT > 0 
COMMIT TRAN ;  
END TRY 

BEGIN CATCH ; 
    DECLARE @ERROR_MESSAGE VARCHAR(200) ; 
    DECLARE @ERROR_SEVERITY INT ; 
    DECLARE @ERROR_STATE INT ; 

    SET @ERROR_MESSAGE = ERROR_MESSAGE() ; 
    SET @ERROR_SEVERITY = ERROR_SEVERITY() ; 
    SET @ERROR_STATE = ERROR_STATE() ; 

    RAISERROR (@ERROR_MESSAGE, -- Message text. 
        @ERROR_SEVERITY , -- Severity. 
        @ERROR_STATE -- State. 
       ); 

Select @ERROR_MESSAGE 

IF @@TRANCOUNT > 0 
     ROLLBACK TRAN ; 

END CATCH ; 
相关问题