正确的方式来处理错误在TSQL交易
问题描述:
我在这种结构有交易:正确的方式来处理错误在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的那?
感谢答案
答
对我来说是更好地知道在手术过程中是问题。 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#代码中没有任何例外 –
你看在TSQL的'RaiseError'声明?使用正确的参数调用它会导致在您的C#代码中抛出异常。 –
执行COMMIT TRAN不会引发在BEGIN TRANS之后产生的错误,如果这是个想法 - 当它们发生时被引发,因此奇数到TRY/CATCH一个COMMIT –
如果您在BEGIN TRAN之后返回,则将其保留为未提交&unrolledback - 请参阅http://www.sommarskog.se/error_handling/Part1.html获取一般模式。 –