必须声明标量变量错误消息

时间:2018-09-19 18:49:22

标签: c# sql sql-server

我正在创建使用此查询的搜索栏。我收到错误消息:

  

必须声明标量变量“ @a”

所有@ a / @ b / @ c / @ d都会出现此错误消息。有人知道错误指的是什么吗?

SELECT [a],[b],[c],[d] 
FROM [dbo].table1 
WHERE (([a] LIKE '%' + @a + '%') 
       OR ([b] LIKE '%' + @b + '%') 
       OR ([c] LIKE '%' + @c + '%') 
       OR ([d] LIKE '%' + @d + '%')); 

我也尝试过:

SELECT * 
FROM [dbo].table1 
WHERE (([a] LIKE '%'+@a+'%') 
       OR ([b] LIKE '%'+@b+'%') 
       OR ([c] LIKE '%'+@c+'%') 
       OR ([d] LIKE '%'+@d+'%'));

选择的目的应该是过滤用户输入,并在显示用户输入结果的同时从表的其余部分过滤掉。任何帮助将不胜感激。

这是我在SQL Server中正常工作后也尝试附加的Button调用。

protected void BtnSearch_Click1(object sender, EventArgs e)
    {
        string mainconn = ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString;
        SqlConnection sqlconn = new SqlConnection(mainconn);
        sqlconn.Open();
        SqlCommand sqlcomm = new SqlCommand();
        string sqlquery = "SELECT * FROM [dbo].Imported_USPFOWEB_Pers_Unit_tbl WHERE (([upc] LIKE '%'+@upc+'%') OR  ([uname] LIKE '%'+@uname+'%') OR ([st_addr] LIKE '%'+@st_addr+'%') OR ([pr_nbr] LIKE '%'+@pr_nbr+'%'))";
        sqlcomm.CommandText = sqlquery;
        sqlcomm.Connection = sqlconn;
        sqlcomm.Parameters.AddWithValue("upc", TxtSearch.Text);
        DataTable dt = new DataTable();
        SqlDataAdapter sda = new SqlDataAdapter(sqlcomm);
        sda.Fill(dt);
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

运行网站并按下按钮时的错误消息如下:

  

System.Data.SqlClient.SqlException:必须声明标量变量“ @uname”。

1 个答案:

答案 0 :(得分:5)

从C#调用此函数时,必须在调用查询之前将 ALL 占位符定义为调用的参数,并在C#代码中设置值:

protected void BtnSearch_Click1(object sender, EventArgs e)
{
    string mainconn = ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString;
    SqlConnection sqlconn = new SqlConnection(mainconn);
    sqlconn.Open();

    SqlCommand sqlcomm = new SqlCommand();
    string sqlquery = "SELECT * FROM [dbo].Imported_USPFOWEB_Pers_Unit_tbl WHERE (([upc] LIKE '%'+@upc+'%') OR  ([uname] LIKE '%'+@uname+'%') OR ([st_addr] LIKE '%'+@st_addr+'%') OR ([pr_nbr] LIKE '%'+@pr_nbr+'%'))";
    sqlcomm.CommandText = sqlquery;
    sqlcomm.Connection = sqlconn;

    // =========================================
    // here, you need to set the values of **ALL** parameters in your query!
    // @upc, @uname, @st_addr, @pr_nbr 
    // =========================================
    // sqlcomm.Parameters.AddWithValue("upc", TxtSearch.Text);

    sqlcomm.Parameters.Add("@upc", SqlDbType.VarChar, 50).Value = TxtSearch.Text;
    sqlcomm.Parameters.Add("@uname", SqlDbType.VarChar, 50).Value = ".....";
    sqlcomm.Parameters.Add("@st_addr", SqlDbType.VarChar, 50).Value =  ".....";
    sqlcomm.Parameters.Add("@pr_nbr", SqlDbType.VarChar, 50).Value =  ".....";

    DataTable dt = new DataTable();
    SqlDataAdapter sda = new SqlDataAdapter(sqlcomm);
    sda.Fill(dt);

    GridView1.DataSource = dt;
    GridView1.DataBind();
}

另外:您应该检出Can we stop using AddWithValue() already?并停止使用.AddWithValue()-这会导致意想不到的结果……

请使用上面添加的代码(并根据需要进行调整-这些参数可能不是全部为SqlDbType.VarChar,或者不是全部都是50个字符长-只是要适应您的情况)。