在SQL Server中,c#的finally
块中是否有类似于try..catch...
子句的内容?
我的意思是,我在SQL Server事务中使用BEGIN TRAN, END TRAN, COMMIT TRAN, ROLLBACK TRAN
等,并且想要一个部分或一组需要触发的操作,无论成功或失败或事务如何。
有解决方案吗? (类似于最终阻止尝试/捕获OOPS语言)。
提前致谢
答案 0 :(得分:4)
没有任何将以“100%可靠性”运行“无论成功或失败”。无论你是在谈论C#程序的“finally”子句,还是在SQL Server上开始尝试...结束尝试开始...结束捕获结构都无关紧要。
问题是这些终端块无法在每个可能的故障模式下执行。每个可能的故障模式都必须包括软件,硬件和网络故障。如果您的客户是政府,也可能必须包括导弹攻击。
强制性引用classic TheDailyWTF。
答案 1 :(得分:1)
事实上,SQL Server中有BEGIN TRY... END TRY...BEGIN CATCH... END CATCH
结构。我经常使用它。
这是一个概述 - 关于选择错误信息的这一点当然是可选的 - 做你认为有意义的事情。
BEGIN TRY
-- do something here.
/* Following line can be used to force termination for testing purposes.
No data changes will be committed.
*/
--RAISERROR('testing', 99, 1);
PRINT 'Successful completion; committing transaction.';
COMMIT TRAN;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
RAISERROR(N'Error occurred; rolling back and terminating.',18,1);
END CATCH;
答案 2 :(得分:0)
最后一次是每次都会引发错误。
如果你想捕获回滚错误 - 你还需要将它放在try..except块中。