-1

次のコードで、cmd1とcmd2が渡され、cmd3が失敗した場合。c#はすべてのブロックを中止しますか(ブロックを試行します)?、または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

例外がスローされると、コードストップは最も近いキャッチブロックにジャンプします。

例外が発生したポイントより下のコードは実行されません。

あなたのシナリオでは、おそらく次のように使用することを検討したいと思うでしょう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 に答える
0

シナリオ cmd1 と cmd2 が実行され、execption がある場合は catch ブロックに移動します。cmd1 が失敗した場合、cmd2 と cmd3 は実行されず、キャッチ ブロックに移動します。また、このリンクを読む価値があります ここに

于 2013-02-18T10:29:31.490 に答える
0

try/catch ブロックはクエリでトランザクションを自動的に実行しないため、cmd1 と cmd2 は実行されます。ただし、おそらくトランザクション スコープを使用してロールバックを実行し、cmd3 が失敗した場合に cmd1/cmd2 で行われた変更を元に戻すことができます。

于 2013-02-18T10:29:36.373 に答える