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