【问题标题】:I get a too many arguments error when I try to delete a row from my database当我尝试从数据库中删除一行时出现太多参数错误
【发布时间】:2014-08-19 09:50:53
【问题描述】:

我用简单的存储过程创建了一个数据库,用于删除、插入、选择和更新数据库三个表中的记录。除了我的删除语句之外,所有这些都有效。我在尝试时收到Procedure or function has too many arguments 消息。我尝试删除它拥有的一个参数,最终删除了表的所有记录,而不是我的目标。我究竟做错了什么?我感觉错误出在我的 SQL 脚本中,但我不知道我可以做些什么不同的事情来让它工作。

消息:

过程或函数 Delete_Special 指定的参数过多。

我的 SQL 脚本:

CREATE PROCEDURE [Delete_Special]
    @ThisID INT
AS
    DELETE FROM [Daily_Specials]
    WHERE @ThisID = [ID]
GO

调用存储过程的事件:

Protected Sub BTN_DeleteEvt_Click(sender As Object, e As EventArgs)
    SQL_Specials.Delete()
End Sub

删节标记:

<asp:SqlDataSource ID="SQL_Specials" runat="server" DeleteCommand="Delete_Special" DeleteCommandType="StoredProcedure">
    <DeleteParameters>
        <asp:ControlParameter ControlID="GV_Eagles_Specials" Name="ThisID" PropertyName="SelectedIndex"
            Type="Int32" />
    </DeleteParameters>
</asp:SqlDataSource>
<asp:GridView ID="GV_Eagles_Specials" runat="server" DataSourceID="SQL_Specials" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button ID="BTN_EditSpecial" runat="server" CssClass="BigText" Text="Edit" OnClick="BTN_EditEvent_Click" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Date" HeaderText="Date" SortExpression="Date" HtmlEncode="False" DataFormatString="{0:MM/dd/yyyy}" />
        <asp:BoundField DataField="Special" HeaderText="Special" SortExpression="Special" HtmlEncode="False" />
        <asp:BoundField DataField="Side" HeaderText="Side" SortExpression="Side" HtmlEncode="False" />
        <asp:BoundField DataField="Special_Price" HeaderText="Special Price" SortExpression="Special_Price" HtmlEncode="False" />
        <asp:BoundField DataField="Soup" HeaderText="Soup" SortExpression="Soup" HtmlEncode="False" />
        <asp:BoundField DataField="Soup_Price" HeaderText="Soup Price" SortExpression="Soup_Price" HtmlEncode="False" />
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:Button ID="BTN_DeleteEvt" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" CssClass="BigText" OnClick="BTN_DeleteEvt_Click" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

【问题讨论】:

  • 你能发布你的 Delete() 方法的主体吗?我假设这是您为 SP 调用分配输入参数的地方...

标签: asp.net sql-server vb.net tsql


【解决方案1】:

看起来问题不在于 SQL Server。我正在浏览 MSDN 寻找这个问题,I found this

在答案中:

所以,我在处理存储过程,因为看起来错误来自那里。我注意到的一件有趣的事情是,存储过程在 SQL 查询分析器中运行得很好,并返回了自动生成的行号,就像它应该的那样。但是,当从 Visual Studio 中运行时,我得到相同的 @Identity 错误,并且存储的过程既不添加表行也不返回行号。

我借了一本 Robert Vieira 的 Professional SQL Server 2000 Programming。 Good 'ol Roberto 在第 367 页有以下要说的内容:

“在调用存储过程时必须使用 OUTPUT 关键字,就像在声明存储过程时一样。这会提前警告 SQL Server 关于该参数需要进行的特殊处理。但是请注意,忘记包含OUTPUT 关键字不会产生运行时错误,但输出参数的值不会移动到您的变量中(您只会得到已经存在的值 - 很可能是 NULL 值)。..."

因为这听起来很像我得到的@Identity 错误,所以我仔细查看了存储过程中的@Identity 定义,假设某些事情无法让 SQL Server 提前知道存储过程有一个输出返回值。运行存储过程时弹出的变量初始化对话框有一个下拉框,用于初始化 @Identity 的值,这看起来很奇怪,因为它是一个 OUTPUT 变量。这两个选项是&lt;DEFAULT&gt;(下拉菜单中的默认设置)和&lt;NULL&gt;

由于比任何理性思考过程都没有想法,我在对话框中将&lt;DEFAULT&gt;更改为&lt;NULL&gt;并运行存储过程。

【讨论】:

    【解决方案2】:

    我认为你的 Where 语句倒退了

    CREATE PROCEDURE [Delete_Special]
        @ThisID INT
    AS
        DELETE FROM [Daily_Specials]
        WHERE @ThisID = [ID]
    GO
    

    我想你可能想要这样

    CREATE PROCEDURE [Delete_Special]
        @ThisID INT
    AS
        DELETE FROM [Daily_Specials]
        WHERE [ID] = @ThisID
    GO
    

    you 参数是您要在 Where 语句中匹配的参数。

    您希望删除 ID 列与参数 @ThisID 匹配的每条记录。

    【讨论】:

    • 我切换了参数和列名,结果还是一样。
    • 你读过@Phrancis 的回答吗?我不确定这到底是什么意思,因为我没有编写您的代码或查看他链接到的答案。
    【解决方案3】:

    您的查询采用输入参数 (ThisID),但您没有使用它调用查询。

    您需要指定要删除哪个ThisID,并且需要将其从GridView 的项目中解析到您的删除函数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多