Sql-Server

唯一鍵約束違規未升級到父儲存過程

  • July 11, 2020

我有一個呼叫 2 個嵌套子過程的儲存過程。例如,

MyProc
 BEGIN
   BEGIN TRY
     BEGIN TRAN
       EXEC UpdateProc
       EXEC InsertProc
     COMMIT TRAN
   END TRY
   BEGIN CATCH
     ROLLBACK TRAN
     ;THROW
   END CATCH
 END

插入儲存過程可以插入具有重複值的行,這違反了唯一鍵約束。我正在從 .NET 應用程序呼叫主記憶體儲過程。如果違反唯一密鑰,我的應用程序沒有收到正確的異常。收到的異常是“指定的演員表無效”。我試過添加SET XACT_ABORT ON,但這並沒有解決問題。

您缺少錯誤處理部分(即TRY...CATCH)。請參閱我在以下 DBA.StackExchange 答案中發布的儲存過程模板:

我們是否需要在 C# 程式碼和儲存過程中處理事務

您是否嘗試在 C# 程式碼中擷取 SqlException?

下面是我的例子:

SQL 程式碼:

DROP PROC IF EXISTS Proc1
GO
CREATE PROC Proc1
AS 
BEGIN
   RAISERROR('This is Proc1',0,1)
END
GO
DROP PROC IF EXISTS Proc2
GO
CREATE PROC Proc2
AS 
BEGIN
   RAISERROR('This is Proc2',18,1)
END
GO
BEGIN TRAN
   BEGIN TRY
       BEGIN TRAN
       EXEC Proc1
       EXEC Proc2
       COMMIT TRAN
   END TRY
   BEGIN CATCH
       ROLLBACK TRAN
       ;THROW
   END CATCH
ROLLBACK
GO
--DROP PROC IF EXISTS Proc1
--GO
--DROP PROC IF EXISTS Proc2
--GO

.NET 程式碼:

...
try
{
   cnn.Open();
   SqlCommand command = new SqlCommand(@"BEGIN TRY
                                           BEGIN TRAN
                                               EXEC Proc2
                                               EXEC Proc1
                                           COMMIT TRAN
                                       END TRY
                                       BEGIN CATCH
                                           ROLLBACK TRAN
                                           ; THROW
                                        END CATCH", cnn);
   command.ExecuteNonQuery();

   cnn.Close();
}
catch (SqlException ex)
{
   Console.WriteLine(ex.Errors[0].Message);
}

結果:

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/141382