SQL 服务器存储过程 - INSERT 添加 2 条记录

SQL Server stored procedure - INSERT adding 2 records

几天来我一直在努力解决这个问题。我正在升级我的 ASP.NET 应用程序以利用 Bootstrap 和 jQuery。过去,一切都运作良好。一个INSERT只插入了1条记录。现在,每次提交我的添加功能时,我都会得到 2 条重复记录(同时插入?)。我不明白为什么?

这是我的存储过程:

ALTER PROCEDURE [dbo].[fs_AddQuickExist] 
    @cid integer,
    @shid integer
AS
BEGIN
    SET NOCOUNT ON; 
    BEGIN TRANSACTION 
       --ASSIGN OTHER VARIABLES
       DECLARE @dst datetime
       SET @dst = GetDate()

       -- ADD THE EXISTING SHOOTER TO THE CLUB
       INSERT INTO shooter_club
       VALUES (@shid, @cid, 0, NULL, NULL)

       COMMIT TRANSACTION   
      SET NOCOUNT OFF;
  END

我只是在 post 之后从我的 ASP.NET 页面执行 (EXEC) 它。我使用 javascript 和 "alert" 框进行了测试 - 页面似乎只加载一次。?

提前谢谢你...

更新:我运行 SQL Profiler 发现它是运行 SP 的两倍。 所以 - 这是我的 ASP 代码(简单形式))

<html>
   <!--#include file="../../systemwide/dbParams.asp"-->
     <link href="../../systemwide/bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
   <link href="../../systemwide/datetimepicker/css/bootstrap-datetimepicker.min.css" rel="stylesheet" media="screen">
   <script type="text/javascript" src="../../systemwide/scripts/jquery-2.1.4.min.js" charset="UTF-8"></script>
   <script type="text/javascript" src="../../systemwide/bootstrap/js/bootstrap.min.js"></script>
 <head>
  <%
  theCID = request.querystring("cid")
  theSID = request.querystring("sid")
  theEID = request.querystring("eid")
  theQID = request.querystring("qid")
  theFNM = request.querystring("fn")
  theLNM = request.querystring("ln")

  set cn=server.createobject("adodb.connection")
  cn.open dbSource

  set rs = cn.execute("EXEC fs_CheckQuickAdd @fn=" & request("fn") & ", @ln=" & request("ln")) 
  %>

  <script language="JavaScript1.2">
      function addExist(id) {
        document.quick.shid.value=id;
        document.quick.fct.value="AX";
          document.quick.submit();
      }

      function addNew() {
        document.quick.fct.value="AN";
          document.quick.submit();
      }
  </script>
 </head>
 <body onload="initDoc(document.canvas);" data-spy="scroll" data-offset="50">
   <form name="quick" method="post" action="squad.asp">
     <input type="hidden" name="cid" value="<%=theCID%>">
     <input type="hidden" name="sid" value="<%=theSID%>">
     <input type="hidden" name="qid" value="<%=theQID%>">
     <input type="hidden" name="eid" value="<%=theEID%>">
     <input type="hidden" name="fn" value="<%=theFNM%>">
     <input type="hidden" name="ln" value="<%=theLNM%>">
     <input type="hidden" name="shid" value="">
     <input type="hidden" name="fct" value="">
     <div class="container">
       <h3><b>Shooter Quick Add</b></h3>
       <p>The system has located some possible matches for your new shooter.  In an effort to keep this database fast and clean, please check this list below to see if one of 
        these shooters is the one that you are adding to your club inventory.</p>                                                                                      
       <div class="table-responsive">          
         <table class="table">
           <thead>
             <tr>
                 <th>&nbsp;</th>
               <th>First Name</th>
               <th>Last Name</th>
               <th>Address</th>
               <th>City</th>
             </tr>
           </thead>
           <tbody>
             <%do until rs.eof%>
               <tr>
                 <td><button onclick='addExist(<%=rs("id")%>);' title="Select This Shooter" class='btn btn-success btn-sm btn-inline'><span class='glyphicon glyphicon-check'></span></button></td>
                 <td><%=rs("fname")%></td>
                 <td><%=rs("lname")%></td>
                 <td><%=rs("address")%></td>
                 <td><%=rs("city")%></td>
               </tr>
               <%rs.movenext
             loop
             rs.close%>
             <tr>
               <td><button onclick='addNew();' title="Add The New Entry" class='btn btn-primary btn-sm btn-inline'><span class='glyphicon glyphicon-plus'></span></button></td>
               <td colspan="4">
                 <p>The shooter that I'm trying to add is not in this list, please just add my entry.</p> 
               </td>
             </tr>
           </tbody>
         </table>
       </div>
     </div>
   </form>             
 </body>
 <%
 set rs=nothing
 cn.close
 set cn=nothing
 %>
</html>

...此 posts 到调用 SP 的函数所在的不同 asp 页面。

我还可以补充一点,在我开始使用 AJAX 和 jQuery 填充页面中的字段之前,我从来没有遇到过这个问题。

所列过程中没有任何内容可以插入两行。

我会启动 SQL Profiler 并在工作完成时进行观察。如果该过程被调用两次,您会在那里看到它。 (我认为多次调用是最有可能的情况。)

要检查的其他(而且相当脆弱)的事情:

  • table 上有触发器吗?
  • 它是 table 还是视图(或者更糟的是嵌套视图)?
  • 我会摆脱 begin transaction / commit。它毫无用处,而且(取决于您系统的复杂性)几乎无法想象它会导致奇怪的并发症。

你的 HTML 是:

<button onclick='addNew();' ...>

addNew() 函数执行此操作:

function addNew() {
    document.quick.fct.value="AN";
    document.quick.submit();
}

问题是 <button> 默认为 "submit" 类型,因此表单被提交了两次:您在 JavaScript 函数中提交,浏览器将其提交为默认操作。两次请求服务器,数据库插入因此运行两次。

解决方案是删除显示为 document.quick.submit(); 的两行或更改两个按钮的按钮类型 (<button type="button">)。