代码之家  ›  专栏  ›  技术社区  ›  Stuart

停止向数据库中重复插入的最佳方法是什么

  •  1
  • Stuart  · 技术社区  · 16 年前

    我有一个使用ASP.NET、C_、SQL Server和Linq to SQL的论坛应用程序。我认为,当按下“插入”按钮时,它会出现多次插入,但也可能是在刷新浏览器或单击“后退”时。

    什么是最全面的方法,或防止这种情况的方法。

    更新: 我目前在插入文本后使用response.redirect。 我认为正确的方法是,在读取响应后,立即用javascript禁用按钮? 然后在隐藏字段(或会话?)上保存唯一值。在表格上。在数据库中为此值创建一个字段,并对照该字段检查该唯一值?

    谢谢

    8 回复  |  直到 14 年前
        1
  •  8
  •   Quassnoi    16 年前
    1. 分配一个 UNIQUE 每个页面的cookie或隐藏控件
      • 创建一个 独特的 表中包含此cookie或控件值的字段。
      • 如果使用相同的cookie插入记录,则 INSERT 将失败,您可以处理(或忽略)此条件。
        2
  •  5
  •   David    16 年前

    当我有一个页面进行插入或更新时,我通常会做一个响应。更新完成后重定向到另一个页面,即使您只是响应。重定向到同一个页面。这样,如果刷新页面,则不会发布数据。

        3
  •  3
  •   Nuno Furtado    16 年前

    请注意,您的问题并非真正特定于您的数据库。发送多个浏览器请求时出现问题,必须解决该问题。要么使用Dave上面所述的重定向模式,要么使用cookie签名

    这里有一个例子 http://aspalliance.com/711_Preventing_Duplicate_Record_Insertion_on_Page_Refresh_or_Postback_of_a_Web_Form

        4
  •  2
  •   SQLMenace    16 年前

    如果您不能使用主键或唯一约束,我建议您使用新的merge语句,如果它不存在,它将插入;如果它存在,它将更新(不知道您的业务规则,这样在您的情况下可能不起作用)merge是SQL Server 2008及更高版本

        5
  •  2
  •   Community CDub    8 年前

    查看此ASP.NET Ajax控件调用 PostBack Ritalin 从一个同事那里 Dave Ward . 这可以帮助您使用已经测试过的解决方案来解决Javascript Disabler的想法。

        6
  •  0
  •   JeeBee    16 年前

    在表单中为注释分配一个唯一的ID,并将其与注释一起记录在数据库中。在执行插入(如果不存在)之前,请检查具有该唯一ID的注释。

    要允许用户在一个活动站点上同时进行多个答复,可以首先分配令牌服务器端,将其放入该用户会话上的活动发布令牌列表中,将其放入注释表单上的隐藏字段中,并且仅允许在会话上的列表中插入表单提交到数据库中。(并在成功插入数据库后将其从会话列表中删除)。 这样可以节省您在数据库中存储过账令牌的时间,这有点简单,但也很糟糕。

        7
  •  0
  •   HLGEM    16 年前

    在数据的自然键上放置唯一索引,以防止输入重复项。如果需要,将其放在表的所有字段上(除了插入时接收系统日期的面向日期的字段或仅由后端使用的字段,如insertedby,它将包含执行插入的人员的用户ID),但ID除外。

        8
  •  0
  •   Walter Mitty    16 年前

    从输入数据流的一列或多列中选择自然主键。使用这些列在表上声明主键约束。如果您已经在代理键上有了主键约束,并且不想删除它,请在自然键上声明一个唯一约束。

    当应用程序尝试向表中插入重复行时,这将导致错误。但是,您必须对应用程序进行编程以记录错误,并做正确的事情。