使查询适配参数和"like"函数。
使查询适配参数和"like"函数。
我看到了很多关于在Sql查询中使用参数和"like"的问题,但我已经尝试了我看到的每一种编码方式,仍然无法让我的查询结果显示出来。如果我在查询本身中放入一个值,它就可以正常运行。当我运行列出的第一个查询时,我会得到错误信息"必须声明标量变量"@Search",但我以为我已经通过cmd.Parameters.AddWithValue语句声明了它。有人能看出我可能做错了什么吗?非常感谢任何帮助。
//声明连接对象
SqlConnection Conn = new SqlConnection();
Conn.ConnectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
//连接到数据库
Conn.Open();
//定义查询
//这个查询不起作用
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE '%' + @Search + '%')";
//这个查询也不起作用
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE @Search";
//这个查询起作用
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE 'MI'";
//声明命令
SqlCommand cmd = new SqlCommand(sql, Conn);
//添加SQL查询所需的参数
cmd.Parameters.AddWithValue("@Search", "%" + txtSearch.Text + "%");
//声明一个SQL适配器
SqlDataAdapter da = new SqlDataAdapter(sql, Conn);
//声明一个数据表
DataTable dt = new DataTable();
//填充数据表
da.Fill(dt);
//绑定ListView
lv.DataSource = dt;
lv.DataBind();
dt.Dispose();
da.Dispose();
Conn.Close();
问题的出现原因是在参数化查询中使用了"like"语句,但是参数的添加方式不正确。解决方法是正确添加参数并修改查询语句。
在上述代码中,我们可以看到在查询语句中使用了"like"语句来模糊匹配State字段的值。然而,在添加参数时,使用了错误的方式。正确的添加参数的方式应该是使用参数名称来指定参数的值。
解决问题的方法是修改代码如下:
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE '%' + @searchValue + '%')"; cmd.Parameters.AddWithValue("@searchValue",txtSearch.Text);
通过以上修改,我们将查询语句中的参数名称改为"@searchValue",并将参数的值设置为txtSearch.Text。这样就可以正确传递参数并进行模糊匹配查询了。
这样,我们就解决了"Getting query to work with parameter and 'like'"的问题。通过修改参数的添加方式并调整查询语句,我们可以正确地使用参数化查询和"like"语句实现模糊匹配。
问题的原因是使用了错误的构造函数SqlDataAdapter da = new SqlDataAdapter(sql, Conn);
,导致没有使用构建好的命令。因此,也没有使用参数,只有不使用参数的查询才有效(第三个查询)。解决方法是使用正确的构造函数SqlDataAdapter da = new SqlDataAdapter(cmd);
。
在更改所使用的构造函数后,可以使用以下查询之一:
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE "; ... cmd.Parameters.AddWithValue("", "%" + txtSearch.Text + "%");
或者:
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE State LIKE '%' + + '%'"; ... cmd.Parameters.AddWithValue("", txtSearch.Text);
没有在字符串中使用+符号是导致问题的原因。
问题:如何使查询语句与参数和“like”一起工作?
在上面的代码中,您没有在SqlDataAdapter中使用参数。在下面的代码中,您将在命令中使用SqlDataAdapter。
//这个查询不起作用 string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE )"; //声明命令 SqlCommand cmd = new SqlCommand(sql, Conn); //添加SQL查询所需的参数 cmd.Parameters.AddWithValue("", "%" + txtSearch.Text + "%"); //声明SQL适配器 SqlDataAdapter da = new SqlDataAdapter(); sa.SelectCommand = cmd
如果您不想使用参数化查询,可以使用以下代码:
//声明连接对象 //这个查询不起作用 string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE '%" + txtSearch.Text + "%')"; //声明SQL适配器 SqlDataAdapter da = new SqlDataAdapter(sql, conn);
尝试了以下代码:
string sql = "SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE '% + + %')"; cmd.Parameters.AddWithValue("", txtSearch.Text);
仍然没有结果。请问一下,如果我使用Update Panel是否会有所不同?我今天才开始使用它,并且正在学习。不过,我放入值的查询工作正常。
更新面板不应该有任何影响。如果您正在使用命令的方法,请在查询中添加通配符,并将select语句更改为:
SELECT CustomerID, LastName, FirstName, Email, Password, Address1, Address2, City, State, Zip, Phone, Fax FROM Customer WHERE (State LIKE )
不想打击你的兴致,但是我只看到您的代码和OP的代码之间有一个不同之处,即您对SqlCommand对象使用了不同的构造函数重载,而原始的重载应该仍然有效。
我没有看到您所说的。OP的代码问题在于SqlDataAdapter使用了sql字符串而没有声明参数。
您的代码太多了,很难看出您的意思。您是否可以只包含需要更改的行的代码示例?
这是主要的不同之处。SqlDataAdapter da = new SqlDataAdapter(); sa.SelectCommand = cmd。这样可以使SqlDataAdapter使用带有参数的cmd。
是的,改用SqlDataAdapter就行了!我不得不说,我有一阵子有点混淆,但是我想我明白你所说的未调用正确的cmd。无法理解为什么带有值的查询可以工作,但其他查询不能。谢谢。