2017-04-05 90 views
1

我在这种结构有交易:正确的方式来处理错误在TSQL交易

CREATE PROCEDURE XXX @param bit 
AS 
BEGIN TRAN 

IF (@param = 1) BEGIN 

    -- DO SOME STUFF LIKE INSERT, UPDATE AND SO ON... 
    RETURN 1 -- RETURN 1 FOR SUCCESS 
END 
ELSE BEGIN 
    -- CONDITION IS NOT SUCCESSFUL SO NOTHING HAPPENED AND I NEED HANDLE 
    -- IN C# 
    RETURN -1 
END 


BEGIN TRY 
    COMMIT TRAN 
END TRY 
BEGIN CATCH 
    ROLLBACK TRAN 
    RETURN -1 
END CATCH 

我已经添加了一些回报clausule,但我不知道是否是它很好的解决方案,并在C#中处理它码?在C#中,我需要处理的只有2个状态:

  • 如果条件适合,和代码没有错误做返回1或真
  • 其他情况下返回-1或虚假

是该程序的身体OK的那?

感谢答案

编辑 为了更好地了解我需要什么,我已经创建了状态图: enter image description here

+1

你看在TSQL的'RaiseError'声明?使用正确的参数调用它会导致在您的C#代码中抛出异常。 –

+2

执行COMMIT TRAN不会引发在BEGIN TRANS之后产生的错误,如果这是个想法 - 当它们发生时被引发,因此奇数到TRY/CATCH一个COMMIT –

+2

如果您在BEGIN TRAN之后返回,则将其保留为未提交&unrolledback - 请参阅http://www.sommarskog.se/error_handling/Part1.html获取一般模式。 –

回答

1

对我来说是更好地知道在手术过程中是问题。 RAISEERROR应该是最好的解决方案。但是它可以被认为是一个观点。

这种解决方案可以帮助我处理.NET应用程序中的异常。

在这种情况下,程序应该看起来像

CREATE PROCEDURE XXX @param bit 
AS 
BEGIN 


DECLARE @ErrorMessage NVARCHAR(4000) 
DECLARE @ErrorSeverity INT 
DECLARE @ErrorState INT 


BEGIN TRY 

BEGIN TRAN TR1 


IF (@param = 1) 
BEGIN 

    -- DO SOME STUFF LIKE INSERT, UPDATE AND SO ON... 
    -- RETURN 1 FOR SUCCESS 
END 
ELSE 
BEGIN 
    -- CONDITION IS NOT SUCCESSFUL SO NOTHING HAPPENED AND I NEED HANDLE 
    -- IN C# 
    RAISERROR ('Incorrect input param error.', -- Message text. 
      16, -- Severity. 
      1 -- State. 
      ); 
END 

    RETURN 1 

COMMIT TRAN TR1 
END TRY 

BEGIN CATCH 

    IF @@TRANCOUNT > 0 
    ROLLBACK TRAN TR1 

    SET @ErrorMessage = ERROR_MESSAGE() 
    SET @ErrorSeverity = ERROR_SEVERITY() 
    SET @ErrorState = ERROR_STATE() 


    RAISERROR (@ErrorMessage,-- Message text. 
       @ErrorSeverity,-- Severity. 
       @ErrorState-- State. 
       ); 
-- this catch also possible errors if @param = 1 

END CATCH 
END 
+0

嗨,谢谢你的回答......但你能告诉我如何在c#中捕获这个错误吗?我使用ado.net,在c#代码中没有任何例外 –