C# 如果查询在错误发生之前运行,是否会在失败的try语句中运行?

C# 如果查询在错误发生之前运行,是否会在失败的try语句中运行?,c#,sql,.net,sql-server,C#,Sql,.net,Sql Server,假设我有以下示例(伪代码示例) 前两个查询是否会在数据库上运行,因为它们在错误发生之前 或 程序会知道有错误而不运行try语句中的代码块并跳转到catch块吗?这就是如何处理存储过程中描述的情况: BEGIN TRANSACTION; BEGIN TRY INSERT SQL to DB 1 INSERT SQL to DB 2 --FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT

假设我有以下示例(伪代码示例)

前两个查询是否会在数据库上运行,因为它们在错误发生之前


程序会知道有错误而不运行try语句中的代码块并跳转到catch块吗?

这就是如何处理存储过程中描述的情况:

BEGIN TRANSACTION;

BEGIN TRY   
   INSERT SQL to DB 1
   INSERT SQL to DB 2
   --FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT
   INSERT SQL to DB 3
END TRY
BEGIN CATCH         
   IF (@@TRANCOUNT > 0) 
      ROLLBACK TRANSACTION;            

   -- Return 0 value to indicate failure of execution
   RETURN 0                             

END CATCH;

-- If transaction is still active then commit it
IF (@@TRANCOUNT > 0) 
   COMMIT TRANSACTION;

-- Return 1 value to indicate successful execution of INSERT statements
RETURN 1
如果
TRY
块中的任何
INSERT
语句出现故障,则所有这些语句都将回滚。否则,所有
INSERT
查询都将提交到数据库


您可以在C#中实现类似的逻辑,但通常最好将整个实现封装在存储过程中。

编程语言(DB适配器/接口)中有一些方法可以在DB级别处理事务。如果这三个查询没有围绕一些代码进行包装,而这些代码本质上打开了一个事务,并在使用commit的第三个语句之后结束它,那么上述两个查询将已经在DB上运行并分别提交。 从代码判断,这3条语句周围没有事务打开/提交/回滚行,这意味着上述两条语句已经提交到数据库,因为DB将它们视为单独的事务。
但是,如果将这3条语句包装在事务打开/提交块周围,然后如果任何一条语句失败,已经执行的查询将回滚,因为代码的catch块将让DB引擎知道事务已打开且未提交,但发生异常,因此回滚以前执行的语句

如果您在代码周围放置一个事务,那么当出现错误时,您可以回滚所有内容。是的,它们将被执行。你需要交易来处理这种情况。好的,谢谢。我明白你的意思:)
BEGIN TRANSACTION;

BEGIN TRY   
   INSERT SQL to DB 1
   INSERT SQL to DB 2
   --FAILURE OCCURS HERE FOR SOME REASON AND IT GOES TO CATCH STATEMENT
   INSERT SQL to DB 3
END TRY
BEGIN CATCH         
   IF (@@TRANCOUNT > 0) 
      ROLLBACK TRANSACTION;            

   -- Return 0 value to indicate failure of execution
   RETURN 0                             

END CATCH;

-- If transaction is still active then commit it
IF (@@TRANCOUNT > 0) 
   COMMIT TRANSACTION;

-- Return 1 value to indicate successful execution of INSERT statements
RETURN 1