1

i have a few stored procedures that do various updates and inserts to a few tables, when a new form is submitted. they are all called from a C# application i have.

right now everything is in a try catch format, is there a way i can ensure that they have all successfully went through before actually commiting the changes to the database?

so let's say everything went through ok to the first 3 stored procedures, but the 4th one fails, i want to reverse what was already done in the first 3.

all or nothing type of deal.

4

4 に答える 4

2

どのように構成されているかわかりません。SqlExceptionしかし、明らかにクラスを使用することができます。しかし、別の方法は次のようなものである可能性があります。

int result = command.ExecuteNonQuery();
if(result == 1)
{
    // Successfully Entered A Row
}
else
{
    // Insert Row Failed
}

これは、テストするための可能な方法です。基本的にはクエリをテストしており、行が返される場合は成功し、そうでない場合は失敗します。それがあなたの基準を満たしているかどうかはわかりませんが、これらはあなたがテストできる2つの方法です。


アップデート:

原因私は読むことができません-しかし、あなたはの形式を実装したいと思いますTransactioning。これは実際にすべてのリクエストを処理し、失敗した場合は変更をロールバックします。それは多くのオーバーヘッドを追加し、場合によっては他のパフォーマンスの問題を引き起こす可能性があります。したがって、それに応じてデータベースのスループットを調整および最適化する必要があります。

これがMSDNからの情報です。

うまくいけば、それがお役に立てば幸いです。

于 2013-03-20T19:46:12.447 に答える
2

You need to use the TransactionScope class (System.Transactions.TransactionScope)

//assuming Table1 has a single INT column, Column1 and has one row with value 12345
//and connectionstring contains a valid connection string to the database.
    //this automatically starts a transaction for you
try
{
            using (TransactionScope ts = new TransactionScope())
            {
        //you can open as many connections as you like within the scope although they need to be on the same server. And the transaction scope goes out of scope if control leaves this code.
               using (SqlConnection conn = new SqlConnection(connectionstring))
               {
                  conn.Open();
                  using (SqlCommand comm = new SqlCommand("Insert into Table1(Column1) values(999)")
                  {
                    comm.ExecuteNonQuery();
                  }
                   using (SqlCommand comm1 = new SqlCommand("DELETE from Table1 where Column1=12345"))
                   {
                     comm1.ExecuteNonQuery();
                   }
                }//end using conn
               ts.Complete() ; //commit the transaction; Table1 now has 2 rows (12345 and 999) 
            }//end using ts

}
  catch(Exception ex)
   {
     //Transaction is automatically rolled back for you at this point, Table1 retains original row.
   }
于 2013-03-20T20:00:16.020 に答える
0

最初の3つで追加した新しいアイテムの一意のキーをキャプチャし、失敗した場合はそれらのキーに基づいて単純に削除します。

于 2013-03-20T19:46:16.650 に答える
0

You should read this

wiki:Database transaction

and this

msdn:Writing a Transactional Application

于 2013-03-20T19:47:55.357 に答える