Asp.net 当我试图从数据库中删除一行时,出现参数过多错误
我用简单的存储过程创建了一个数据库,用于删除、插入、选择和更新数据库三个表中的记录。除了我的delete语句,它们都可以工作。当我尝试时,我收到一条Asp.net 当我试图从数据库中删除一行时,出现参数过多错误,asp.net,sql-server,vb.net,tsql,Asp.net,Sql Server,Vb.net,Tsql,我用简单的存储过程创建了一个数据库,用于删除、插入、选择和更新数据库三个表中的记录。除了我的delete语句,它们都可以工作。当我尝试时,我收到一条过程或函数有太多参数的消息。我尝试删除它拥有的一个参数,结果删除了表中的所有记录,而不是我的目标记录。我做错了什么?我感觉我的SQL脚本中有错误,但我不知道我可以做些什么来让它正常工作 消息: CREATE PROCEDURE [Delete_Special] @ThisID INT AS DELETE FROM [Daily_Spe
过程或函数有太多参数的消息。我尝试删除它拥有的一个参数,结果删除了表中的所有记录,而不是我的目标记录。我做错了什么?我感觉我的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_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>
调用存储过程的事件:
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>
节略标记:
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>
您的查询接受一个输入参数(ThisID
),但您不使用它调用查询
您需要指定要删除哪个ThisID
,并且需要将它从GridView的项解析到删除函数中。我认为您的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
匹配的所有记录。看来问题不在于SQL Server。我正在浏览MSDN以了解此问题,并且
在答复中:
因此,我正在对存储的进程进行反复研究,因为它看起来像是从那里产生的错误。我注意到的一件有趣的事情是,存储过程在SQL查询分析器中运行良好,并返回自动生成的行号。然而,当从VisualStudio中运行时,我得到了相同的@Identity错误,存储的过程既不添加表行,也不返回行号
我借了一本Robert Vieira的专业SQL Server 2000编程。很好,罗伯托在第367页上说:
“调用存储过程时必须使用OUTPUT关键字,就像声明存储过程时一样。这会提前向SQL Server发出有关该参数将需要的特殊处理的警告。但是,请注意,忘记包含OUTPUT关键字不会创建运行时错误,但是OUTPUT参数的值不会被移动到变量中(您只会得到已经存在的值-很可能是空值)。。。"
由于这听起来很像我遇到的@Identity错误,我仔细查看了存储过程中的@Identity定义,假设有什么东西没有事先让SQL Server知道存储过程有一个输出返回值。运行存储过程时弹出的变量初始化对话框一个下拉框,用于初始化@Identity的值,因为它是一个输出变量,所以看起来很奇怪。两个选项是
(下拉列表中的默认设置)和
我在对话框中将
更改为
,并运行存储的过程,这更多的是因为我没有想法,而不是任何理性思维过程
你能发布Delete()方法的主体吗?我想这就是你为SP调用分配输入参数的地方……我切换了参数和列名,但结果是一样的。你读了@Phrancis的答案了吗?我不确定它的确切含义,因为我没有编写你的代码或查看他链接的答案。