-1

在下面的代码中,如果 cmd1 和 cmd2 通过而 cmd3 失败。do c# abort all block (try block) ?, 还是继续执行 cmd1 和 cmd2 ?.

              try
            {

                sqlConnection1.Open();
                cmd1.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();
                cmd3.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                MessageBox.Show("An error occured " + ex.Message);
            }

            finally
                {
                    sqlConnection1.Close();
                }
4

4 回答 4

1

cmd1 和 cmd2 将在您指定的场景中执行,并且 cmd3 上的异常将被异常处理捕获。

为了实现在 cmd3 失败时中止 cmd1 和 cmd2 的行为,您可以将所有 sql 命令放在一个存储过程中并使用TRANSACTION 和 ROLLBACK

于 2013-02-18T10:26:50.870 回答
0

给定你的场景 cmd1 和 cmd2 将执行,如果有 execption 那么它将去 catch 块。如果 cmd1 失败,那么它不会执行 cmd2 和 cmd3 并且会去 catch 块。同样值得在这里阅读此链接

于 2013-02-18T10:29:31.490 回答
0

cmd1 和 cmd2 将被执行,因为 try/catch 块不会自动执行查询事务。但是,如果 cmd3 失败,您也许可以使用事务范围执行回滚并撤消在 cmd1/cmd2 中所做的更改。

于 2013-02-18T10:29:36.373 回答
0

当抛出异常时,代码停止跳转到最近的 catch 块。

任何低于异常发生点的代码 - 都不会被执行。

在您的场景中,您可能想考虑这样使用TransactionScope

using(var trans = new TransactionScope())
{
  try
  {
     //your setup code goes here

    sqlConnection1.Open();
                cmd1.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();
                cmd3.ExecuteNonQuery();

    trans.Complete();
   }
   catch(Exception)
   {
    //handle exception
   }
}

trans.Complete()如果未执行statemenet,对数据库所做的任何更改都会回滚。

于 2013-02-18T10:33:18.663 回答