Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在调用两次SqlDataSource UpdateCommand_C#_Asp.net_Gridview_Sqldatasource - Fatal编程技术网

C# 正在调用两次SqlDataSource UpdateCommand

C# 正在调用两次SqlDataSource UpdateCommand,c#,asp.net,gridview,sqldatasource,C#,Asp.net,Gridview,Sqldatasource,我有一个绑定到SqlDataSource的GridView。我在执行UpdateCommand时遇到了问题,它似乎执行了两次。当我在gvu行更新事件中单步执行代码时,我看到所有操作都正常运行,并且存储过程被执行。我已经验证了存储过程是否正常工作,因为db表中有一条新记录。但当此事件退出时,我得到以下错误: 过程或函数usp_TestLogInsert的参数太多 指定的 我看到数据源上的更新事件是在RowUpdating事件之后调用的。我已尝试取消此事件以防止多次更新尝试,但随后什么也没有发生,G

我有一个绑定到SqlDataSource的GridView。我在执行UpdateCommand时遇到了问题,它似乎执行了两次。当我在gvu行更新事件中单步执行代码时,我看到所有操作都正常运行,并且存储过程被执行。我已经验证了存储过程是否正常工作,因为db表中有一条新记录。但当此事件退出时,我得到以下错误:

过程或函数usp_TestLogInsert的参数太多 指定的

我看到数据源上的更新事件是在RowUpdating事件之后调用的。我已尝试取消此事件以防止多次更新尝试,但随后什么也没有发生,GridView仍处于编辑模式

ASP代码

<asp:UpdatePanel ID="upGridView" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:GridView ID="gvChecklist" runat="server" 
                  AutoGenerateColumns="false" DataSourceID="dsChecklist"
                  AutoGenerateEditButton="true" 
                  onrowupdating="gvChecklist_RowUpdating">
      <Columns>
        <asp:TemplateField HeaderText="Status">
          <ItemTemplate>
            <asp:Label ID="lblStatus" runat="server" 
                       Text='<%#Eval("Status") %>' />
          </ItemTemplate>
          <EditItemTemplate>
            <asp:DropDownList ID="ddStatus" runat="server" 
                              DataTextField="Status" 
                              DataValueField="ID" 
                              DataSourceID="dsStatus" />
          </EditItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Division" 
                        HeaderText="Division"
                        readonly="true" />
        <asp:BoundField DataField="Application"
                        HeaderText="Application"
                        readonly="true" />
        <asp:BoundField DataField="Task"
                        HeaderText="Task"
                        readonly="true" />
        <asp:BoundField DataField="TestedBy" 
                        HeaderText="Tested By" 
                        readonly="true"/>
        <asp:BoundField DataField="Notes" 
                        HeaderText="Notes" 
                        ReadOnly="false"/>
        <asp:BoundField DataField="JiraTicket"
                        HeaderText="JIRA Ticket"
                        readonly="false" />
        <asp:BoundField DataField="ID" />
      </Columns>
    </asp:GridView>
  </ContentTemplate>
  <Triggers>
    <asp:PostBackTrigger ControlID="gvChecklist" />
  </Triggers>
</asp:UpdatePanel>
</td>
</tr>
</table>

<asp:SqlDataSource ID="dsChecklist" 
                   SelectCommand=" SELECT l.ID, d.division, c.Context AS Application, t.Task, l.TestedBy, l.Notes, l.JiraTicket, s.Status
                                   FROM Automation.manual.Tests t
                                   OUTER APPLY 
                                         (SELECT TOP 1 *
                                          FROM Automation.manual.TestLog l
                                          WHERE l.TestID = t.ID 
                                          ORDER BY l.Date DESC) l
                                   INNER JOIN Automation.dbo.Context c ON  c.ID = t.Context
                                   INNER JOIN Automation.dbo.Division d ON d.ID = t.Division
                                   LEFT OUTER JOIN Automation.manual.Status s ON s.ID = l.Status"
                   runat="server"                                
                   ConnectionString="<%$ ConnectionStrings:AutomationDBConnectionString %>" 
                   onupdating="dsChecklist_Updating" >
  <UpdateParameters>
    <asp:Parameter Name="Status" DbType="Int32" />
    <asp:Parameter Name="TestID" DbType="Int32" />
    <asp:Parameter Name="TestedBy" DbType="String" />
    <asp:Parameter Name="Notes" DbType="String" />
    <asp:Parameter Name="JiraTicket" DbType="String" />
    <asp:Parameter Name="Build" DbType="String" />
  </UpdateParameters>
</asp:SqlDataSource>
编辑:我使用SQL探查器查看存储过程中发送了哪些参数。即使插入发生并创建了新记录,仍会发送一个名为ID的额外参数。我从未显式发送过这个参数,但它似乎是创建的,因为我在GridView中有一个名为ID的BoundField。
在原始问题的基础上,是否有方法使UpdateCommand忽略此BoundField,使其不会自动将其用作参数?

使用SQL探查器后,我看到BoundField ID被隐式添加为UpdateCommand参数。将此字段更改为TemplateItem可修复此问题

                       <asp:TemplateField>
                        <ItemTemplate>
                            <asp:TextBox ID="tbId" Text='<%#Eval("ID") %>' ReadOnly="true" runat="server"></asp:TextBox>
                        </ItemTemplate>
                       </asp:TemplateField>


您可以发布更新
dsChecklist\u
的代码吗?该事件为空。我在代码中创建了它,以查看它是否被击中。UpdateCommand似乎在my RowUpdate事件中执行,但在调用dsChecklist\u Update事件之后。请发布
[自动].[手动].[usp\u TestLogInsert]
的TSQL。
                       <asp:TemplateField>
                        <ItemTemplate>
                            <asp:TextBox ID="tbId" Text='<%#Eval("ID") %>' ReadOnly="true" runat="server"></asp:TextBox>
                        </ItemTemplate>
                       </asp:TemplateField>