2009-11-03 87 views
1

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

回答

1

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

+0

我喜欢这种方式。但是,如果我比较空值呢?因为我会说= null,没有东西可以= null,但它可以是isNull。 – Eric 2009-11-04 14:54:10

+0

你可以尝试在可能为空的字段中添加一些类似于“IS NOT NULL”的查询。很难确定没有看到查询的例子。 – ChadNC 2009-11-04 20:01:22

4

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

+0

我很喜欢这个。首先我会明天早上去尝试。 – Eric 2009-11-03 22:55:25

+0

这里的同事太害怕尝试这一个。他们不喜欢篡改数据库。 – Eric 2009-11-04 15:11:42

+0

你也可以在你的DataSet上加一个* Key *来做到这一点。 – 2009-11-04 19:42:44

0

你使用了哪些数据库?如果它是MySQL,并且您的实施的某些其他因素保持一致,则始终可以使用INSERT IGNORE INTO ...编辑:触击SQL Server

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

  1. 用户试图执行“行动”
  2. 用户发送到“doAction.xxx”
  3. “doAction.xxx”完成,并重定向到“actionDone.xxx”
  4. ???
  5. 利润!

编辑:重新读你的问题后,我要更倾向于第二种解决方案;通过使用重定向创建中间页面(通常是HTTP/1.1 303 See Other),通常可以防止这种混淆。在数据库中检查唯一标识符总是一个好主意,但对于不希望刷新重复最后一个操作的简单情况,这是一个优雅且完善的解决方案。

+0

我使用sql server – Eric 2009-11-04 14:08:02

3

我同意@Austin Salonen,您应该首先保护具有主键,唯一约束和外键的数据库。

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

+1

JS技巧非常适合减少服务器的负载,但它不会保护你。关掉JS甚至恶意提交多个请求的用户呢? – rmeador 2009-11-03 22:37:08

+0

@rmeador - 同意。没有数据库保护,没有真正的解决方案。 JS技术只能被认为是方便用户使用的。 – 2009-11-03 22:56:52

0

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

你也可以有一个标志,指示插入请求是否已经提交,它要么存放的页面(使用JavaScript),或在会议上。您也可以进一步将其存储在其他地方,但这是您的Web应用程序的架构决定。

如果您正在使用AJAX请求中插入一条记录,然后这是一个有点很难防止这种在客户端。

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

1

Dereleased说,使用基于303重定向。使表单提交使用POST,然后保存后,它发送一个303标题,并通过位置标题将它们发送到提交后的URL,该标题将通过GET获取,刷新不会重新发布数据。

1

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

快速搜索后,我觉得这是我根据我的解决方案从文章:

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

它基本上展示了如何建立一个新的页面类,你可以继承。当你正在做一些不应该在刷新时重复的事情时,基类将公开一个你调用的方法,以及一个IsPageRefresh方法来跟踪是否发生刷新。

这篇文章是许多类似目标变化的基础,所以它应该是一个很好的开始。不幸的是我不记得它是如何真的给予更多的帮助。