Какой лучший способ остановить повторяющиеся вставки в базу данных - PullRequest
1 голос
/ 17 апреля 2009

У меня есть приложение на форуме, использующее asp.net, c #, sql server и linq to sql. Он страдает от нескольких вставок, я думаю, когда кнопка вставки нажата, но также возможно, когда обновляется браузер или нажата кнопка возврата.

Какой самый полный способ или способы предотвратить это.

UPDATE: В настоящее время я использую response.redirect после вставки текста. Я думаю, что, возможно, правильный подход после прочтения ответов - немедленно отключить кнопку с помощью javascript? Затем следует сохранить уникальное значение в скрытом поле (или сеансе?) В форме. Создать поле в БД для этого значения и сравнить это уникальное значение с этим полем?

Спасибо

Ответы [ 8 ]

8 голосов
/ 17 апреля 2009
  1. Назначить UNIQUE cookie или скрытый элемент управления каждой странице
    • Создайте поле UNIQUE в своей таблице, которое содержит этот файл cookie или управляющее значение.
    • Если в тот же файл cookie вставлена ​​запись, INSERT завершится ошибкой, и вы сможете обработать (или проигнорировать) это условие.
5 голосов
/ 17 апреля 2009

Когда у меня есть страница, которая выполняет вставку или обновление, я обычно делаю Response.Redirect на другую страницу после завершения обновления, даже если вы просто Response.Redirect на ту же страницу. Таким образом, если страница обновляется, вы не публикуете свои данные повторно.

3 голосов
/ 17 апреля 2009

Обратите внимание, что ваша проблема не относится к вашей базе данных. У вас проблема с отправкой нескольких запросов браузера, и вы должны обойти эту проблему. Либо используйте шаблон перенаправления, как указано выше Дейвом, либо используйте подпись Cookie

Один пример можно найти здесь http://aspalliance.com/711_Preventing_Duplicate_Record_Insertion_on_Page_Refresh_or_Postback_of_a_Web_Form

2 голосов
/ 17 апреля 2009

Проверьте этот элемент управления ASP.NET AJAX с именем PostBack Ritalin от товарища SO'r Дейва Уорда . Это может помочь вам с уже протестированным решением для вашей идеи отключения JavaScript.

2 голосов
/ 17 апреля 2009

используйте первичный ключ или уникальное ограничение, если вы не можете этого сделать, я предлагаю вам использовать новый оператор MERGE, который будет вставляться, если он не существует, или обновлять, если он существует (так что не знаете ваши бизнес-правила) это может не работать в вашей ситуации) MERGE - это SQL Server 2008 и выше

0 голосов
/ 17 апреля 2009

Поместите уникальный индекс в естественный ключ данных, чтобы предотвратить ввод дубликатов. Если требуется, поместите его во все поля таблицы (кроме тех, которые ориентированы на дату, которые получат системную дату во время вставки, или полей, используемых только серверной частью, такой как insertby, которая будет содержать идентификатор пользователя, выполняющего эту операцию). вставка) кроме идентификатора.

0 голосов
/ 17 апреля 2009

Назначьте уникальный идентификатор в форме для комментария и запишите его вместе с комментарием в базе данных. Перед выполнением вставки выполните проверку комментариев с этим уникальным идентификатором, если он не существует.

Чтобы позволить пользователю иметь несколько ответов на активном сайте одновременно, вы можете изначально выделить серверную часть токена, поместить ее в список активных токенов публикации в сеансе для этого пользователя и поместить в скрытое поле. в форме комментария и разрешите вставку формы отправки в базу данных только в том случае, если этот токен находится в списке сеанса (и удалите его из списка сеанса после успешной вставки в базу данных). Это избавит вас от необходимости хранить токен публикации в базе данных, как указано выше, что немного проще, но невзрачно.

0 голосов
/ 17 апреля 2009

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

Это приведет к ошибке, когда приложение попытается вставить повторяющуюся строку в таблицу. Вам, однако, придется запрограммировать приложение, чтобы оно отображало ошибку и действовало правильно.

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