Как мне потерпеть неудачу, когда DELETE не удаляет? - PullRequest
0 голосов
/ 30 июня 2009

У меня проблема в том, что я могу УДАЛИТЬ, но затем, когда я нажму обновить и отправить данные поста, он попытается удалить снова. Это не проблема, но теперь вторая оценка - это проблема, поскольку она уменьшается, когда не должна.

Что такое одновременный безопасный способ уменьшения, но только если delete удалил запись? Обратите внимание, что msgId - это PK, поэтому я буду удалять 0 или 1

public void removeMediaMsg(long userId, long msgId)
{
    using (var dbTrans = connection.BeginTransaction())
    {
        command.CommandText = "DELETE FROM user_media_subscription "
            + "WHERE msgId=@msgId AND recipientId=@recipientId;";
        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 userId=@userId;";
        command.Parameters.Add("@userId", DbType.Int64).Value = userId;
        command.ExecuteNonQuery();
        dbTrans.Commit();
    }
}

Ответы [ 3 ]

1 голос
/ 30 июня 2009

ExecuteNonQuery () возвращает количество затронутых строк, поэтому что-то подобное может работать

public void removeMediaMsg(long userId, long msgId)
{
    using (var dbTrans = connection.BeginTransaction())
    {
        command.CommandText = "DELETE FROM user_media_subscription "
            + "WHERE msgId=@msgId AND recipientId=@recipientId;";
        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 userId=@userId;";
            command.Parameters.Add("@userId", DbType.Int64).Value = userId;
            command.ExecuteNonQuery();
        }
        dbTrans.Commit();    
    }
}

Тем не менее, вы должны запрограммировать свое приложение, чтобы избежать воспроизведения команды при обновлении. Один из способов сделать это - использовать перенаправление или просто визуализировать другое представление после успешного удаления.

1 голос
/ 30 июня 2009

Я предполагаю, что из выражения «когда я нажимаю обновить» вы выполняете это из ASP.NET. Что мне показалось полезным, так это следить за транзакцией с помощью Response.Redirect на страницу сводки. Таким образом, нажатие кнопки «Обновить» не повторяет команду «Удалить».

0 голосов
/ 30 июня 2009

Было бы неплохо сделать запрос на выборку перед удалением, чтобы проверить, что он находится в таблице. Если это не так, вы можете просто вернуть функцию и больше ничего не делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...