2017-04-05 116 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#代碼中沒有任何例外 –