【问题标题】:Must declare the scalar variable "@UserId" in delete statement.必须在删除语句中声明标量变量“@UserId”。
【发布时间】:2012-07-09 16:06:07
【问题描述】:

我遇到了这个错误:当我试图删除我的 SqlServer 中的一个特定行时,必须声明标量变量“@UserId”。我已经在 DeleteParameters 中声明了 UserId,但仍然出现此错误。

异常详情:System.Data.SqlClient.SqlException: 必须声明标量变量 > "@UserId".

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

这是我的代码:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ASPNETDBConnectionString1 %>" 
    SelectCommand="SELECT aspnet_Membership.Email, Details.CustName, Details.CustNum, Details.CustRole, Details.CustStatus, Details.PName, Details.PEmail, Details.PRole, Details.WedDate, aspnet_Users.UserName, Details.UserId FROM Details INNER JOIN aspnet_Membership ON Details.UserId = aspnet_Membership.UserId INNER JOIN aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId WHERE (Details.UserId = @UserId)"
    UpdateCommand="update Details SET CustName = @CustName, CustNum = @CustNum, CustRole = @CustRole, CustStatus = @CustStatus, PName = @PName, PEmail = @PEmail, PRole = @PRole, WedDate = @WedDate WHERE [UserId] = @UserId Update aspnet_Membership Set Email= @email WHERE [UserId] = @UserId"
    DeleteCommand="DELETE FROM Details WHERE [UserId] = @UserId">
    <DeleteParameters>
        <asp:Parameter Name="UserId" type="String" />
        <asp:Parameter Name="CustName" />
        <asp:Parameter Name="CustNum" />
        <asp:Parameter Name="CustRole" />
        <asp:Parameter Name="CustStatus" />
        <asp:Parameter Name="PName" />
        <asp:Parameter Name="PEmail" />
        <asp:Parameter Name="PRole" />
        <asp:Parameter Name="WedDate" />
        <asp:Parameter Name="email" />
    </DeleteParameters>
    <SelectParameters>
        <asp:ControlParameter ControlID="lblHidden" Name="UserId"
        PropertyName="Text" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="CustName" />
        <asp:Parameter Name="CustNum" />
        <asp:Parameter Name="CustRole" />
        <asp:Parameter Name="CustStatus" />
        <asp:Parameter Name="PName" />
        <asp:Parameter Name="PEmail" />
        <asp:Parameter Name="PRole" />
        <asp:Parameter Name="WedDate" />
        <asp:Parameter Name="UserId" />
        <asp:Parameter Name="email" />
    </UpdateParameters>
</asp:SqlDataSource>
<asp:DetailsView ID="DetailsView1" runat="server"
    AutoGenerateRows="False" DataSourceID="SqlDataSource1"
    Height="50px" Width="125px">
    <Fields>
        <asp:BoundField DataField="Email" HeaderText="Email"
            SortExpression="Email" />
        <asp:BoundField DataField="CustName" HeaderText="CustName"
            SortExpression="CustName" />
        <asp:BoundField DataField="CustNum" HeaderText="CustNum"
            SortExpression="CustNum" />
        <asp:BoundField DataField="CustRole" HeaderText="CustRole"
            SortExpression="CustRole" />
        <asp:BoundField DataField="CustStatus" HeaderText="CustStatus"
            SortExpression="CustStatus" />
        <asp:BoundField DataField="PName" HeaderText="PName"
            SortExpression="PName" />
        <asp:BoundField DataField="PEmail" HeaderText="PEmail"
            SortExpression="PEmail" />
        <asp:BoundField DataField="PRole" HeaderText="PRole"
            SortExpression="PRole" />
        <asp:BoundField DataField="WedDate" HeaderText="WedDate"
            SortExpression="WedDate" />
        <asp:BoundField DataField="UserName" HeaderText="UserName"
            SortExpression="UserName" />
        <asp:BoundField DataField="UserId" HeaderText="UserId"
            SortExpression="UserId" />
        <asp:CommandField ShowDeleteButton="True"
            ShowEditButton="True" />
    </Fields>
</asp:DetailsView>
<asp:Label ID="lblHidden" runat="server" Text="Label" Visible="False">
</asp:Label>

【问题讨论】:

  • 在select语句中添加UseId
  • AFAIK,您不能在单个数据源中使用两个更新语句。
  • 尝试在 asp:DetailsView 上设置DataKeyNames="UserID",因为我认为这是找不到您要删除的行的原因,但我不确定,这就是我留下评论的原因。也可能原因是您声明的 UserId 不是一个刺痛。

标签: c# asp.net sql runtime-error


【解决方案1】:

我认为您已经按原样粘贴了 T-SQL 查询。我想解释一下你在这里做什么:

SELECT aspnet_Membership.Email, Details.CustName, Details.CustNum, 
    Details.CustRole, Details.CustStatus, Details.PName, Details.PEmail, 
    Details.PRole, Details.WedDate, aspnet_Users.UserName, Details.UserId 
FROM Details 
INNER JOIN aspnet_Membership ON Details.UserId = aspnet_Membership.UserId 
INNER JOIN aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId 
WHERE (Details.UserId = @UserId) 

此查询根据UserId从下表中检索数据

  1. 详情
  2. aspnet_Membership
  3. aspnet_Users

您必须将 UserId 传递给 SqlDataSource 才能执行其功能:了解如何使用 INSERT, UPDATE and DELETE with SQLDataSource

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多