【问题标题】:Procedure or function has too many arguments specified in FormView and SQL SERVER c#过程或函数在 FormView 和 SQL SERVER c# 中指定的参数过多
【发布时间】:2016-05-23 07:09:24
【问题描述】:

我有一个名为 VideoGalleryDelete 的存储过程。我正在使用FormViewGridview 来插入、更新、显示和删除数据。 VideoGallery 是我的主表,PK VideoId 有一个外键为 CategoryId

当我点击Delete linkButton时,它说Procedure or function has too many arguments specified

这是我的 SP:

ALTER PROCEDURE [dbo].[VideoGalleryDelete]
@VideoId int
AS
BEGIN

DELETE FROM [dbo].[VideoGallery]
      WHERE VideoId = @VideoId
      END

GridView 及其分配的 SqlDataSource :

<asp:GridView ID="gvVideo" CssClass="table" runat="server" OnSelectedIndexChanged="gvVideo_SelectedIndexChanged" AutoGenerateColumns="False" DataKeyNames="VideoId,CategoryId" DataSourceID="sdVideoList">
    <Columns>
        <asp:BoundField DataField="VideoId" Visible="false" HeaderText="VideoId" InsertVisible="False" ReadOnly="True" SortExpression="VideoId" />
        <asp:BoundField DataField="VideoLink" HeaderText="Video Link" SortExpression="VideoLink" />
        <asp:BoundField DataField="CategoryId" HeaderText="Category Id" SortExpression="CategoryId" />
        <asp:TemplateField ItemStyle-CssClass="Center" HeaderStyle-Width="15%">
            <ItemTemplate>
                <asp:ImageButton ImageUrl="~/images/edit.png" ID="lnkedit" Style="margin-left: 15px" CommandName="Select" runat="server" Width="20px"></asp:ImageButton>
                <asp:ImageButton ImageUrl="~/images/delete.png" ID="lnkDelete" CommandName="Delete" Style="margin-left: 15px" runat="server" Width="20px" OnClientClick="return ConfirmDelete();"></asp:ImageButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

<asp:SqlDataSource ID="sdVideoList" runat="server" ConnectionString="<%$ ConnectionStrings:WebAAERT_DBConnectionString %>" DeleteCommand="VideoGalleryDelete" DeleteCommandType="StoredProcedure" SelectCommand="VideoGallerySelect" SelectCommandType="StoredProcedure">
    <DeleteParameters>
        <asp:Parameter Name="VideoId" Type="Int32" />
    </DeleteParameters>
    <SelectParameters>
        <asp:Parameter DefaultValue="0" Name="CategoryId" Type="Int32" />
    </SelectParameters>

【问题讨论】:

  • 我相信这可能是因为您在 GridView 上同时拥有 VideoId 和 CategoryId 作为 DataKeyNames,因此它试图同时使用它们来识别要删除的记录。您可以通过将存储过程设置为接受然后忽略的 CategoryId 来证明这一点。但是,这不是一个好的解决方案,所以这是评论而不是答案。
  • 我给了两个数据键名并不重要。我的删除参数是 Videoid

标签: c# asp.net sql-server stored-procedures sqldatasource


【解决方案1】:

我认为您误用了网格视图控件的 DataKeyNames 属性。理想情况下,此属性应仅包含用于标识当前行的主键字段。此外,此属性上设置的每个单个值都将被传递通过删除命令。

您的删除存储过程采用一个参数,但由于DataKeyNames="VideoId,CategoryId" 正在传递两个值。因此您可以执行@Chris Flynn 建议的操作或将网格视图更改为DataKeyNames="VideoId"

【讨论】:

  • 我已经给出了 DataKeyNames。如您所见,我已将删除参数设置为 VideoId
  • 我需要 categoryId 来更新记录。
  • 然后使用VideoId查找CategoryId
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2017-10-10
  • 1970-01-01
  • 2023-03-26
  • 2014-02-08
相关资源
最近更新 更多