SQL Server存储过程 - INSERT添加2条记录

时间:2015-10-15 17:42:42

标签: jquery sql-server sql-insert

我现在已经在这个问题上敲了几天。我正在升级我的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

我只是在帖子后从我的ASP.NET页面执行(EXEC)它。我使用带有“警告”框的javascript进行测试 - 似乎页面只加载一次。?

提前谢谢你......

更新:我运行了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>

...这会发布到调用SP的函数所在的不同asp页面。

我还可以补充一点,直到我开始使用AJAX&amp; jQuery填充页面中的字段。

2 个答案:

答案 0 :(得分:0)

列出的程序中没有任何内容可以插入两行。

我会启动SQL事件探查器并在工作完成时观察。如果程序被调用两次,你会在那里看到它。 (我认为最有可能出现多次通话。)

要检查的其他(并且非常脆弱):

  • 桌子上有触发器吗?
  • 是表格还是视图(或者更糟糕的是嵌套视图)?
  • 我摆脱了begin transaction / commit。服务器没有任何意义,并且(取决于系统的复杂性),几乎可以想象它会导致奇怪的并发症。

答案 1 :(得分:0)

您的HTML是:

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

并且addNew()函数执行此操作:

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

问题是<button>默认为“提交”类型,因此表单提交两次:您在JavaScript函数中提交它,浏览器将其作为默认操作提交。因此,对服务器的两个请求以及数据库插入运行两次。

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