【问题标题】:ASP.NET C# Must declare the scalar variableASP.NET C# 必须声明标量变量
【发布时间】:2012-03-06 13:00:38
【问题描述】:

我正在尝试使用名为 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”。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

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

来源错误:

第 282 行:数据集 ds = new DataSet();

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

如果有人能说明情况,我将不胜感激!

【问题讨论】:

  • 感谢所有回复,普遍的共识似乎是我在我的 sql 参数中缺少@,但已经尝试过并且抛出了同样的错误。此外,我的语法与最初为我的下拉列表发布的语法完全相同。

标签: c# asp.net


【解决方案1】:

这个:

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

应该是这样的:

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

对不起,打字太快了,试试:

cmd.Parameters.AddWithValue("@QUALID", val);

好的,您的代码中有一个更基本的问题。您创建了一个命令对象,然后将 SQL 字符串和命令的连接传递到您的数据适配器中,它将在其中执行您的 sql 字符串,而连接上没有任何参数。

我没有过多使用dataadapter,但我认为你需要在你的adapter的select命令上设置参数。

【讨论】:

  • 再次出现同样的错误!我认为这些都是有效的选择,这让我认为它是由其他地方引起的。希望我知道在哪里!
【解决方案2】:

尝试像这样将 @ 添加到您的 sql 参数中

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

【讨论】:

    【解决方案3】:

    您在添加参数的位置缺少“@”:

    SqlParameter("@QUALID", val)
    

    【讨论】:

      【解决方案4】:

      改变

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

      到任何一个

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

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

      你应该很高兴。您的问题是参数名称中缺少“@”

      【讨论】:

        【解决方案5】:
        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();
        

        使用 dis 一个就可以了...(da.selectcommand = cmd;)

        【讨论】:

        • 这确实是一个可能的解决方案,我将对此进行简单的解释。 OP 有一个 SqlCommand 对象,但从未使用过它。更简单的解决方法是new SqlDataAdapter(cmd) 使用 selectcommand 对象而不是“sql”字符串来初始化适配器。 PS:使用三个字母的变量名也不好,尝试 objCommand & strSql 并加倍可读性(在我看来)
        【解决方案6】:

        如果使用下拉列表,您需要在里面添加选定的值:

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

        【讨论】:

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