繁体   English   中英

SQL Server存储过程-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

我只需在发布后从我的ASP.NET页执行(EXEC)。 我使用带有“警告”框的javascript进行了测试-看来该页面仅加载一次。

先感谢您...

更新:我运行SQL事件探查器,发现它运行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和jQuery填充页面中的字段之前,我从未遇到过此问题。

列出的过程中没有插入两行的内容。

我会启动SQL事件探查器,并观察工作完成情况。 如果该过程被调用两次,您将在此处看到它。 (我认为最有可能发生多次通话)。

其他要检查的东西(也很脆弱):

  • 桌子上有触发器吗?
  • 它是表还是视图(或更糟的是嵌套视图)?
  • 我将摆脱begin transaction / commit 它没有任何目的,并且(取决于系统的复杂性)几乎无法想象会引起奇怪的复杂性。

您的HTML是:

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

addNew()函数执行以下操作:

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

问题是<button>在默认情况下是“ submit”类型的,因此该表单要提交两次:您在JavaScript函数中提交了表单,浏览器将其作为默认操作提交了。 向服务器发出两个请求,因此数据库插入操作将运行两次。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM