当我尝试从数据库中删除一行时,我收到了太多的参数错误

时间:2014-08-19 09:50:53

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

我使用简单的存储过程创建了一个数据库,用于删除,插入,选择和更新数据库的三个表中的记录。除了我的删除语句之外,它们都有效。我尝试时收到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>

3 个答案:

答案 0 :(得分:3)

看起来问题不在于SQL Server。我正在浏览MSDN以解决此问题并I found this

答案:

  

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

     

我借用了Robert Vieira的Professional SQL Server 2000编程副本。好的&#39; ol Roberto在第367页有以下说法:

     

&#34;调用sproc时必须使用OUTPUT关键字,就像声明sproc时一样。这为SQL Server提供了有关该参数所需的特殊处理的警告。但是,请注意,忘记包含OUTPUT关键字不会产生运行时错误,但输出参数的值不会被移动到您的变量中(您只需查看已经存在 - 很可能是NULL值)。 ...&#34;

     

由于这听起来很像我得到的@Identity错误,我仔细研究了存储过程中的@Identity定义,假设某些事情未能让SQL Server提前知道存储过程已经存在OUTPUT返回值。运行存储过程时弹出的变量初始化对话框有一个下拉框,用于初始化@Identity的值,因为它是一个OUTPUT变量,看起来很奇怪。这两个选项是<DEFAULT>(下拉列表中的默认设置)和<NULL>

     

由于缺乏理念而不是任何理性思考过程,我在对话框中将<DEFAULT>更改为<NULL>并运行存储过程。

答案 1 :(得分:1)

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

您需要指定要删除的ThisID,并且需要从GridView的项目中将其解析为删除功能。

答案 2 :(得分:1)

我认为你的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

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

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