【问题标题】:Correct way to handle ERROR in TSQL transaction在 TSQL 事务中处理错误的正确方法
【发布时间】:2017-08-31 05:24:33
【问题描述】:

我有这个结构的交易:

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

我添加了一些 return clausule 但我不知道它是否是好的解决方案,并在 c# 代码中处理它?在 c# 中,我只需要处理 2 个状态:

  • 如果条件合适,并且代码完成且没有错误返回 1 或 true
  • 其他情况返回 -1 或 false

那个程序体可以吗?

感谢解答

编辑 为了更好地理解我需要什么,我创建了状态图:

【问题讨论】:

  • 你看过TSql中的RaiseError语句了吗?使用正确的参数调用它会导致在您的 C# 代码中引发异常。
  • 执行 COMMIT TRAN 不会引发在 BEGIN TRANS 之后生成的错误,如果这就是想法 - 它们会在发生时引发,因此尝试/捕获 COMMIT 很奇怪
  • 如果您在 BEGIN TRAN 之后返回,则将其保留为未提交和未回滚 - 有关一般模式,请参阅 sommarskog.se/error_handling/Part1.html
  • 请检查更新的问题,我已经添加了所需程序的图表
  • 如果交易中没有发生任何事情,我也需要处理。

标签: c# sql .net tsql ado.net


【解决方案1】:

对我来说最好知道在手术过程中哪里出了问题。 RAISEERROR 应该是最好的解决方案。但是ofc可以被认为是观点。

这种解决方案还可以帮助我处理 .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

【讨论】:

  • 嗨,谢谢你的回答......但你能给我举个例子,如何在 c# 中捕获这个错误吗?我在 c# 代码中使用 ado.net,没有任何异常
猜你喜欢
  • 1970-01-01
  • 2012-10-06
  • 2019-05-17
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多