ASP.NET C# 必须声明标量变量

9
我正在尝试使用一个名为PopulateGrid()的方法来填充GridView,但是一直遇到相同的服务器错误:“必须声明标量变量“@QUALID”。
public void PopulateGrid()
    {
        String val = TextBox2.Text;

        String sql = "SELECT QLEVELNAME FROM Qual_Levels WHERE QUALID=@QUALID";
        SqlCommand cmd = new SqlCommand(sql,
           new SqlConnection(ConfigurationManager.ConnectionStrings["RecruitmentDBConnString"].ConnectionString));
        
        cmd.Parameters.Add(new SqlParameter("QUALID", val));

        cmd.Connection.Open();


        SqlDataAdapter da = new SqlDataAdapter(sql, cmd.Connection);

        DataSet ds = new DataSet();
        da.Fill(ds, "Qual_Levels");


        SelectionGrid.DataSource = ds;
        SelectionGrid.DataBind();


        ds.Dispose();
        da.Dispose();
        cmd.Connection.Close();
        cmd.Connection.Dispose();
    }

GridView的声明如下所示:
<asp:GridView ID="SelectionGrid"
            autogeneratecolumns="False" 
            runat="server" CellPadding="4" 
            ForeColor="#333333" GridLines="None" DataKeyNames="QUALID">
            
            <Columns>
                <asp:BoundField DataField="QLEVELNAME" HeaderText="Level Name" 
                    ReadOnly="True" SortExpression="name" />
            </Columns>
</asp:GridView>

尝试了无数方法并搜索论坛后,我仍然遇到同样的错误。

'/'应用程序中的服务器错误。

必须声明标量变量“@QUALID”。

说明:在执行当前Web请求时发生未经处理的异常。请查看堆栈跟踪以获取有关错误和代码源的更多信息。

异常详细信息: System.Data.SqlClient.SqlException: 必须声明标量变量“@QUALID”。

源错误:

Line 282: DataSet ds = new DataSet();

Line 283: da.Fill(ds, "Qual_Levels");

如果有人能够解决这个问题,我将不胜感激!


1
感谢所有的回复,普遍的共识似乎是我在我的 SQL 参数中缺少了 @,但我已经尝试过了,仍然出现相同的错误。此外,我的下拉列表具有与最初发布的完全相同的语法,它们正常工作。 - PatrickJames
6个回答

3
这是:

cmd.Parameters.Add(new SqlParameter("QUALID", val));

should be this:

cmd.Parameters.Add(new SqlParameter("@QUALID", val));

抱歉,我打得太快了,请尝试:
cmd.Parameters.AddWithValue("@QUALID", val);

好的,你的代码有一个更基础的问题。你创建了一个命令对象,但是你把 SQL 字符串和连接传递到了数据适配器中,适配器会在它自己的连接上执行没有参数的 SQL 语句。

我没有太多使用数据适配器的经验,但我认为你需要在适配器的 Select 命令上设置参数。


同样的错误再次出现!我认为这些都是有效的选项,这让我觉得问题是在其他地方引起的。但愿我知道是哪里! - PatrickJames

1

你在添加参数时漏掉了“@”符号:

SqlParameter("@QUALID", val)

1

更改

cmd.Parameters.Add(new SqlParameter("QUALID", val));

要么

cmd.Parameters.Add(new SqlParameter("@QUALID", val));

或者

cmd.Parameters.Add("@QUALID", SqlDbType.WhatFitsYourDB).Value = val; 

你应该没问题了。你的问题是参数名称中缺少 '@' 符号。


1
请尝试像这样在您的SQL参数中添加@符号
 cmd.Parameters.Add(new SqlParameter("@QUALID", val));

1
String val = TextBox2.Text;

String sql = "SELECT QLEVELNAME FROM Qual_Levels WHERE QUALID=@QUALID";
SqlCommand cmd = new SqlCommand(sql, new SqlConnection(ConfigurationManager.ConnectionStrings["RecruitmentDBConnString"].ConnectionString));
SqlDataAdapter da = new SqlDataAdapter(sql, cmd.Connection);
DataSet ds = new DataSet();
cmd.Parameters.Add(new SqlParameter("@QUALID", val));

da.SelectCommand = cmd;
cmd.Connection.Open();

da.Fill(ds, "Qual_Levels");


SelectionGrid.DataSource = ds;
SelectionGrid.DataBind();

ds.Dispose();
da.Dispose();
cmd.Connection.Close();
cmd.Connection.Dispose();

请使用这个,它会起作用... (da.selectcommand = cmd;)

这确实是一个可能的解决方案,我要在这里简单地解释一下。原始问题(OP)有一个 SqlCommand 对象,但从未使用过它。甚至更简单的解决方法是使用“new SqlDataAdapter(cmd)”初始化适配器,使用 selectcommand 对象而不是“sql”字符串。PS:使用三个字母的变量名称也不好,尝试 objCommand&strSql 并且可以加倍阅读(在我看来)。 - T_D

0

如果使用下拉列表,您需要在内部添加所选值:

SelectedValue='<%# Bind ("QUALID") %>'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接