声明后仍然“必须声明标量变量”错误

时间:2014-04-28 20:33:47

标签: asp.net sql

我试图编写一些相当简单的ASP.NET代码来操作SQL Server 2012数据库中的数据。我之前已经完成了一百次,但由于某些原因,这不起作用,这让我发疯了。

我有以下代码。页面正确加载并显示数据。我还可以通过修改textboxes中的值并点击“更新”按钮来成功更新记录。但是删除按钮不起作用 - 每次单击它时,我都会收到错误必须声明标量变量@PhoneNumberID 。正如您所看到的,我已将变量包含在我的DeleteParameters中,它与我在UpdateParameters中声明的方式相同,这似乎工作正常!

<asp:Label ID="lblPersonID" runat="server" Text="2" /><br /><br />
<asp:ListView ID="lvEditPhoneNumbers" runat="server" DataSourceID="SQLEditPhoneNumbers" >
    <ItemTemplate>
        <asp:Label ID="lblPhoneNumberID" runat="server" Text='<%#Bind("PhoneNumberID")%>' />
        <asp:DropDownList ID="ddlEditPhoneNumberType" runat="server" DataSourceID="SQLPhoneNumberType" DataTextField="Description" DataValueField="ID" SelectedValue='<%#Bind("PhoneNumberTypeID")%>' />
        <asp:SqlDataSource ID="SQLPhoneNumberType" runat="server" ConnectionString="<%$ ConnectionStrings:ContactsConnectionString %>"
            SelectCommand="SELECT * FROM [PhoneNumberType] WHERE [Deleted] = 0"></asp:SqlDataSource>
        <asp:TextBox ID="txtEditPhoneNumber" runat="server" Text='<%#Bind("PhoneNumber")%>' CssClass="contactdetailseditfield" />
        <asp:ImageButton ID="btnDeletePhoneNumber" runat="server" ImageUrl="~/Images/trash-26.png" Width="15px" Height="15px" ToolTip="Delete this phone number" CommandName="Delete" />
        <asp:Button ID="btnUpdate" runat="server" Text="Update" CommandName="Update" />
    </ItemTemplate>
</asp:ListView>
<asp:SqlDataSource ID="SQLEditPhoneNumbers" runat="server" ConnectionString="<%$ ConnectionStrings:ContactsConnectionString %>"
    SelectCommand="SELECT * FROM [PhoneNumbers] WHERE ([PersonID] = @PersonID) AND ([Deleted] = 0)"
    UpdateCommand="UPDATE [PhoneNumber] SET [PhoneNumber] = @PhoneNumber, [PhoneNumberType] = @PhoneNumberTypeID WHERE ([ID] = @PhoneNumberID)"
    DeleteCommand="UPDATE [PhoneNumber] SET [Deleted] = 1 WHERE ([ID] = @PhoneNumberID)" >
    <SelectParameters>
        <asp:ControlParameter ControlID="lblPersonID" Name="PersonID" PropertyName="Text" Type="String" />
    </SelectParameters>
    <DeleteParameters>
        <asp:Parameter Name="PhoneNumberID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="PhoneNumberID" Type="Int32" />
        <asp:Parameter Name="PhoneNumber" Type="String" />
        <asp:Parameter Name="PhoneNumberTypeID" Type="Int32" />
    </UpdateParameters>            
</asp:SqlDataSource>

是的,我知道数据的显示方式并不是很好 - 我把这些代码从它应该出现的页面中取出来试图找出正在发生的事情。是的,我知道我已经在UPDATE中添加了DeleteCommand命令,但我过去没有遇到任何问题(至少我认为我有),无论如何,如果我在命令中取出paramaterised值并用明确声明的值替换它,它就可以工作。

1 个答案:

答案 0 :(得分:2)

当您使用数据绑定控件的DeleteItem函数(例如ListView)时,需要DataKeyNames属性来自动绑定要删除的参数值。否则,即使您已在PhoneNumberID中将DeleteCommand标识为您需要的参数,但实际上并未向其提供值,因此它仍被视为未声明:

<asp:ListView ID="lvEditPhoneNumbers"
              runat="server"
              DataSourceID="SQLEditPhoneNumbers"
              DataKeyNames="PhoneNumberID">
              ^^^^^  add this