2009-04-17 2 views
1

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

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

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

Благодаря

+0

Страдаете? У вас параллелизм, и это страдание? о мой. – 2009-04-17 16:41:43

ответ

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

Загрязняет таблицу базы данных с кратковременными жетонами, хотя решение в противном случае является правильным, вам нужно хранить только активные токены в сеансе (на стороне сервера), а не в базе данных - после установки удалите токен из сеанса. – JeeBee

0

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

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

+0

Первичный ключ не будет относиться к передаваемым данным. Суррогатный ключ может, но вы не будете использовать его в качестве первичного ключа. – cjk

+1

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

+0

Первичный ключ подразумевает уникальное ограничение. Первичный ключ может быть на определенном столбце автонабора, который вы создаете, но он также может находиться в одном или нескольких столбцах из входного потока. Попробуйте, вам может понравиться! –

5

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

+0

Хороший ответ. Также стоит отключить кнопку немедленно, чтобы остановить людей, дважды щелкнув – cjk

+0

. Я согласен, что это хорошая идея, однако, после вставки в db я хочу отображать данные на одной странице, я, может быть, в ретроспективе должен иметь текстовый редактор как отдельную страницу, но у меня она встроена на страницу и скрывается/отображается при добавлении текста. – Stuart

+0

Это тоже сработало для нас. – Mark

3

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

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

2

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

+0

merge звучит как хорошая часть решения, но только получил sql 2005 – Stuart

0

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

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

0

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

2

Проверьте это управление ASP.NET AJAX под названием PostBack Ritalin от партнера SO'r Dave Ward. Это может помочь вам с уже проверенным решением вашей идеи javascript disabler.

+0

Я проверю это, кажется подходящим, спасибо – Stuart

Смежные вопросы