Sql-Server
唯一鍵約束違規未升級到父儲存過程
我有一個呼叫 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# 程式碼中擷取 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); }
結果: