我有一个使用asp.net,c#,sql server和linq to sql的论坛应用程序。它有多个插入,我认为当按下插入按钮时,也可能在刷新浏览器或单击后退时。
最全面的方法是什么,或者是防止这种情况的方法。
更新: 我目前在插入文本后使用response.redirect。 我想也许正确的方法,在阅读回复后,是用javascript立即禁用按钮? 然后在表单上的隐藏字段(或会话?)上保存唯一值。在数据库中为此值创建一个字段,并针对此字段检查此唯一值?
由于
答案 0 :(得分:8)
UNIQUE
Cookie或隐藏控件
UNIQUE
字段。INSERT
将失败,您可以处理(或忽略)此条件。答案 1 :(得分:5)
当我有一个插入或更新的页面时,我通常会在更新完成后对另一个页面执行Response.Redirect,即使您只是Response.Redirect到同一页面。这样,如果刷新页面,则不会重新发布您的数据。
答案 2 :(得分:3)
请注意,您的问题并非真正针对您的数据库。发送多个浏览器请求时遇到问题,您必须解决该问题。使用Dave上面所述的重定向模式或使用Cookie签名
答案 3 :(得分:2)
使用主键或唯一约束,如果你不能这样做我建议你使用新的MERGE语句,如果它不存在将插入,如果它存在则更新(不知道你的业务规则如此在您的情况下可能不起作用)MERGE是SQL Server 2008及更高版本
答案 4 :(得分:2)
从SO'r PostBack Ritalin中查看名为Dave Ward的ASP.NET AJAX控件。这可以帮助您使用已经过测试的解决方案来解决您的javascript disabler问题。
答案 5 :(得分:0)
从输入数据流的一列或多列中选择一个自然主键。使用这些列在表上声明主键约束。如果您已在代理键上具有主键约束,并且您不想将其删除,请在自然键上声明UNIQUE约束。
当应用程序尝试将重复行插入表中时,这将导致错误。但是,您必须对应用程序进行编程以记录错误,并做正确的事情。
答案 6 :(得分:0)
在注释的表单中指定唯一ID,并将其与数据库中的注释一起记录。如果不存在,请在执行插入之前检查具有该唯一ID的注释。
要允许用户同时在活动的站点上进行多次回复,您可以最初分配令牌服务器端,将其放入该用户的会话上的活动发布令牌列表中,将其放入隐藏字段在注释表单上,只允许表单提交插入到数据库中(如果该令牌位于会话列表中)(并在成功插入数据库后将其从会话列表中删除)。
,这样可以节省您将过帐令牌存储在数据库中的过程,这样做更容易一些。答案 7 :(得分:0)
在数据的自然键上放置一个唯一索引,以防止输入重复项。如果需要,将它放在表的所有字段中(除了任何面向日期的那些将在插入时接收系统日期或仅由后端使用的字段,例如insertedby,其中包含该人的用户ID)插入)除了id。