【问题标题】:MySql Where Clause ParameterMySql Where 子句参数
【发布时间】:2020-05-19 13:29:44
【问题描述】:
MySqlCommand command = new MySqlCommand("
    select * 
    from singlecustomer 
    where name like concat ('%',@search,'%') 
        or code like concat ('%',@search,'%') 
        or id like concat ('%',@search,'%')", con);

command.Parameters.Add(new MySqlParameter("@search", "%"+sc.sc_SearchBox.Text+"%"));

MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.SelectCommand = command;
DataTable dt = new DataTable();
adapter.Fill(dt);
sc.dgClientLog.DataSource = dt;

这是方法 验证搜索是否成功。

SearchClientDataGrid(sc);
if (sc.dgClientLog.Rows.Count == 0)
{
    sc.NoItemFoundLabel.Visible = true;
    sc.NoItemFoundLabel.BringToFront();
    return;
}
else
{
    sc.NoItemFoundLabel.Visible = false;
}

它有效,但每当我以字符“%”开头搜索时,例如:%David,它仍然有效, 有没有办法删除%?我最近正在学习 MySql Parameter 以避免 Sql Injection。它只是让我觉得 % 确实有效,而不是返回 no found。

【问题讨论】:

  • sc.sc_SearchBox.Text.Trim('%')
  • 嗨 fubo 感谢您的回复。即使使用修剪,% 仍然有效,我也会做一个声明,但我担心它不会是动态搜索,因为做声明会使其成为应用程序级别的搜索,而不是数据库级别的搜索。
  • 你能具体说明一下你的例子吗?我不确定我是否正确地回答了这个问题。输入/结果/预期结果
  • 嗨 fubo,我将它应用到了 datagridview,通过从数据库中搜索并将其提供给数据集以显示到 datagridview。我收到输入/结果错误。例如,当我搜索名称时。大卫,它工作得很好,但是当我添加像 %David 这样的 % 字符时,它仍然会输出结果 David,我想要期待的是,如果我输入 %David 它不应该从包含大卫数据的表中返回一行,由于 % 字符,如果我尝试使用 #David 进行搜索,它不会返回我也希望使用 % 发生的行。

标签: c# mysql asp.net


【解决方案1】:

为此,您必须使用 mysql 转义字符 \ 转义 % 字符 reference。那么它就不再被视为特殊字符了。

所以解决办法是

string search = "%" + sc.sc_SearchBox.Text.Replace("%", @"\%") + "%";
command.Parameters.Add(new MySqlParameter("@search",search));

您可能应该查看引用的表并处理另一个特殊字符_,它也是LIKE 搜索使用的通配符。另一个转义由 mySQLParameter 处理。例如以下将" 变为\"(使用参数时在内部应用MySqlHelper.EscapeString

string result = MySqlHelper.EscapeString("foo\"bar");

【讨论】:

  • 它成功了!我将阅读有关 MySqlHelper 和 EscapeString 的信息,感谢您的努力 Fubo。非常感谢你hhh。
猜你喜欢
  • 2013-06-02
  • 1970-01-01
  • 2021-10-13
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多