2009-06-29 5 views
0

Le problème que j'ai est que je pourrais SUPPRIMER mais quand j'appuie sur rafraîchir et envoie les données de poste il essayera de supprimer encore. Ce qui n'est pas un problème mais maintenant la deuxième déclaration est un problème car elle diminue quand il ne devrait pas.Comment puis-je échouer lorsque DELETE ne supprime pas?

Qu'est-ce qu'un moyen de diminuer simultanément mais uniquement si la suppression a supprimé une entrée? Notez MSGID est un PK donc je vais supprimer soit 0 ou 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(); 
    } 
} 

Répondre

1

ExecuteNonQuery() retourne le nombre de lignes affectées, donc quelque chose comme cela pourrait fonctionner

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();  
    } 
} 

Cela dit, vous devez programmer votre application pour éviter rejouant une commande lors de l'actualisation. Une façon de le faire est d'utiliser la redirection ou simplement de rendre une vue différente après une suppression réussie.

0

Ce serait une bonne idée de faire une requête de sélection avant la suppression pour vérifier si elle est dans le tableau. Si ce n'est pas le cas, vous pouvez simplement retourner la fonction et ne rien faire d'autre.

+0

Il est préférable de simplement vérifier le nombre de lignes affectées. L'utilisation d'une sélection supplémentaire est redondante et lente. – configurator

1

Je devine à partir de l'instruction "quand j'appuie l'actualisation" que vous l'exécutez depuis ASP.NET. Ce que j'ai trouvé utile est de suivre la transaction avec un Response.Redirect à la page de résumé. Ainsi, si vous appuyez sur Actualiser, la commande Supprimer ne sera pas répétée.

+0

Noté. Après avoir résolu le problème (il peut y avoir un cas moins évident quand il s'agit d'un problème) je vais le faire pour se débarrasser de renvoyer indésirable –

Questions connexes