检测重复插入

时间:2009-11-03 22:21:56

标签: c# .net asp.net vb.net visual-studio

刷新后是否有更简单的方法来防止重复插入?我现在这样做的方法是选择除ID以外的所有字段作为参数;如果记录存在,我不插入。有没有办法可以检测刷新?

7 个答案:

答案 0 :(得分:4)

假设它是一个数据库,您可以对“除ID以外的所有字段”的组合设置唯一约束,并在插入或更新时捕获异常。

答案 1 :(得分:3)

我同意@Austin Salonen的说法,首先应该使用主键,唯一约束和外键来保护数据库。

这样做,许多网站将在提交按钮后面包含一些JS,以便在发送请求之前立即禁用该按钮。这样,双击的用户不会发送两个请求。

答案 2 :(得分:1)

我想你可能想要EXISTS功能。 以下是我通过谷歌找到的EXISTS的简单解释。

答案 3 :(得分:1)

已发布所述,请使用基于303的重定向。使表单提交使用POST,然后在保存之后发送303头并通过Location头将其发送到提交后的URL,该头将通过GET获取并且刷新不会重新发布数据。

答案 4 :(得分:1)

自从我完成任何真正的网络工作以来已经有很长一段时间了。但是在1.1天之后,我记得使用与回发相关联的ID来确定是否发生了刷新。

快速搜索之后,我认为这是我根据我的解决方案提供的文章:

http://msdn.microsoft.com/en-us/library/ms379557(VS.80).aspx

它基本上向您展示了如何构建可以继承的新页面类。基类将公开一种方法,当您执行不应在刷新时重复的操作时调用该方法,并使用IsPageRefresh方法跟踪是否发生了刷新。

那篇文章是很多具有类似目标的变化的基础,因此它应该是一个好的开始。不幸的是,我不记得它是如何真正提供更多帮助的。

答案 5 :(得分:0)

你在使用什么数据库?如果它是MySQL,并且您的实现的某些其他因素一致,您可以始终使用INSERT IGNORE INTO ...编辑:Struck for SQL Server

或者,您可以创建“处理程序”页面,例如你的过程如下:

  1. 用户尝试执行“操作”
  2. 用户被发送到“doAction.xxx”
  3. “doAction.xxx”完成,并重定向到“actionDone.xxx”
  4. ???
  5. 利润!
  6. 编辑:在重新阅读你的问题之后,我将更倾向于第二个解决方案;通过创建一个带有重定向的中间页面(通常是HTTP/1.1 303 See Other),您通常可以防止这种混淆。检查数据库上的uniques总是一个好主意,但对于不希望刷新重复上一个操作的简单情况,这是一个优雅且完善的解决方案。

答案 6 :(得分:0)

我在提交请求后将选项重定向到另一个(确认)页面(插入数据库中的记录)。这样他们就无法刷新。

您还可以拥有一个标志,指示是否已提交插入请求并将其存储在页面上(使用javascript)或在会话中。您还可以进一步将其存储在其他位置,但这是Web应用程序的架构决策。

如果您正在使用AJAX请求插入记录,那么在客户端阻止此操作会有点困难。

我宁愿做一个指标/标志然后比较字段。当然,这取决于您的记录。例如,如果它是一个简单的商店并且用户想要制作相同的订单,那么您将把它视为重复的订单并有效地阻止该功能。