2017-04-05 6 views
1

ich Transaktion mit dieser Struktur haben:korrekte Art und Weise ERROR in TSQL Transaktion zu behandeln

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 

ich eine Rückkehr clausule hinzugefügt haben, aber ich weiß nicht, ob es eine gute Lösung ist, und behandeln es in C# Code? In C# ich brauche nur zwei Zustände behandeln:

  • Wenn Bedingung passt, und ohne Fehler gemacht Code zurück 1 oder wahr
  • Andere Fälle -1 zurück oder falsch

Ist das Verfahren Körper ok für Das?

Danke für Antworten

EDIT Für ein besseres Verständnis, was ich brauche, ich habe Zustandsdiagramm erstellt: enter image description here

+1

Haben Sie in der 'RaiseError' Anweisung in Tsql geschaut? Wenn Sie dies mit den richtigen Parametern aufrufen, wird eine Ausnahme in Ihrem C# -Code ausgelöst. –

+2

Das Ausführen von COMMIT TRAN wird keine Fehler erzeugen, die nach dem BEGIN TRANS erzeugt werden, wenn das die Idee ist - sie werden ausgelöst, wenn sie auftreten, so dass sie ungerade zu TRY/CATCH a COMMIT –

+2

Wenn Sie nach einem BEGIN TRAN RÜCKKEHREN, lassen Sie es beide uncommitted & entrolledback - Siehe http://www.sommarskog.se/error_handling/Part1.html für allgemeine Muster. –

Antwort

1

Für mich ist besser, zu wissen, wo Problem während des Verfahrens war. RAISEERROR sollte die beste Lösung sein. Aber es kann als Sichtweise betrachtet werden.

Diese Art von Lösung kann mir auch helfen, Ausnahme in .NET-Anwendung zu behandeln.

In diesem Fall Verfahren sollte scheint wie

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

Hallo, danke für die Antwort ... aber können Sie mir ein Beispiel geben, wie Sie diesen Fehler in C# fangen? Ich benutze Ado.net und keine Ausnahme in C# -Code –

Verwandte Themen