我正在创建使用此查询的搜索栏。我收到错误消息:
必须声明标量变量“ @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”。
答案 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个字符长-只是要适应您的情况)。