在以下代码中,如果使用cmd3传递的cmd1和cmd2失败。 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();
}
答案 0 :(得分:1)
cmd1和cmd2将在您指定的方案中执行,并且异常处理将捕获cmd3上的异常。
要实现cmd3失败时中止cmd1和cmd2的行为,您可以将所有sql命令放在一个存储过程中并使用TRANSACTION and ROLLBACK
答案 1 :(得分:0)
根据您的方案,cmd1和cmd2将执行,如果有execption,那么它将进入catch块。如果cmd1失败,那么它将不执行cmd2和cmd3并将进入catch块。另外值得阅读此链接here
答案 2 :(得分:0)
cmd1和cmd2将被执行,因为try / catch块不会自动执行查询事务。但是,如果cmd3失败,您可以使用transaction scope执行回滚并撤消cmd1 / cmd2中所做的更改。
答案 3 :(得分:0)
当抛出异常时,代码停止跳转到nearst catch块。
发生异常的点以下的任何代码 - 都没有执行。
在您的Senario中,您可能想考虑使用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
}
}
如果未执行statemenet trans.Complete()
,则会回滚对数据库所做的任何更改。