2009-06-29 11 views
0

問題は私が削除することができますが、その後、私はリフレッシュし、投稿データを送信すると再び削除しようとします。これは問題ではありませんが、今は2番目の文章は問題になります。DELETEが削除されなかった場合、どうすれば失敗しますか?

削除が削除された場合にのみ、同時に減らす安全な方法は何ですか? note msgIdはPKなので、0または1を削除します。

public void removeMediaMsg(long userId, long msgId) 
{ 
    using (var dbTrans = connection.BeginTransaction()) 
    { 
     command.CommandText = "DELETE FROM user_media_subscription " 
      + "WHERE [email protected] AND [email protected];"; 
     command.Parameters.Add("@msgId", DbType.Int64).Value = msgId; 
     command.Parameters.Add("@recipientId", DbType.Int64).Value = userId; 
     command.ExecuteNonQuery(); 

     command.CommandText = "UPDATE user_data SET mediaMsgCount=mediaMsgCount-1 WHERE [email protected];"; 
     command.Parameters.Add("@userId", DbType.Int64).Value = userId; 
     command.ExecuteNonQuery(); 
     dbTrans.Commit(); 
    } 
} 

答えて

1

のExecuteNonQuery()は、影響を受ける行の数を返すので、このようなものは、あなたがたときにさわやかなコマンドの再生を避けるために、あなたのアプリケーションをプログラミングする必要があり、言っ

public void removeMediaMsg(long userId, long msgId) 
{ 
    using (var dbTrans = connection.BeginTransaction()) 
    { 
     command.CommandText = "DELETE FROM user_media_subscription " 
      + "WHERE [email protected] AND [email protected];"; 
     command.Parameters.Add("@msgId", DbType.Int64).Value = msgId; 
     command.Parameters.Add("@recipientId", DbType.Int64).Value = userId; 
     int affected = command.ExecuteNonQuery(); 
     if (affected == 1) { 
      command.CommandText = "UPDATE user_data SET mediaMsgCount=mediaMsgCount-1 WHERE [email protected];"; 
      command.Parameters.Add("@userId", DbType.Int64).Value = userId; 
      command.ExecuteNonQuery(); 
     } 
     dbTrans.Commit();  
    } 
} 

を働くかもしれません。これを行う1つの方法は、リダイレクトを使用するか、正常に削除された後に別のビューをレンダリングすることです。

0

削除前に選択クエリを実行してテーブルにチェックインすることをお勧めします。そうでない場合は、関数を返すだけで何もしないことができます。

+0

影響を受けた行数を確認することをお勧めします。余分なセレクトを使用すると、冗長で遅くなります。 – configurator

1

私は、ASP.NETからこれを実行している "私がリフレッシュした時"のステートメントから推測しています。私が有用だと分かったのは、トランザクションをサマリーページへのResponse.Redirectで追跡することです。このようにしてリフレッシュを実行しても、Deleteコマンドは繰り返されません。

+0

注目。私は問題を解決した後に(この問題が発生するとあまり明白ではないかもしれない)私はこれをして不要な再送信を取り除く –

関連する問題