【问题标题】:How to ignore empty textbox while searching?搜索时如何忽略空文本框?
【发布时间】:2019-03-01 11:14:38
【问题描述】:

你好!我想在 mysql 中搜索数据时忽略空文本框。

private void button4_Click(object sender, EventArgs e)
{con.Open(); 


 MySql.Command mycommand (SELECT * FROM table WHERE " +
"Name Like '" + textbox1.Text + "'" +
"Nachname Like '" + textbox2.Text + "'" +
"Alter Like '" + textbox3.Text + "'",


con);
read = mycommand.ExecuteReader();
dt.Load(read);
datagridView.DataSource = dt;
con.Close();}

【问题讨论】:

  • 假设“忽略”是指“匹配任何内容”,那么您需要做的就是修剪任何实际存在的空格字符吗?另外,如果要获得正确的匹配,您是否不需要 % 围绕字符串?
  • 是的,我试过了,但它不适用于 %

标签: c# mysql database insert command


【解决方案1】:

有很多方法可以解决这个问题,但理想情况下,您应该使用参数化查询而不是搜索值的字符串连接;第二个有人说他们正在搜索像“O'reilly”这样的名字,你的查询被破坏了。 (有关“bobby drop tables”,请参见 google)。

但是,既然您使用的是字符串连接,为什么不在构建查询时检查字段的值是否为空?

或者,使用类似这样的参数化查询:

SELECT * 
FROM table 
WHERE (@p1 = '' OR `Name` LIKE @p1) 
  AND (@p2 = '' OR `Nachname` LIKE @p2) 
  AND (@p3 = '' OR `Alter` LIKE @p3)
;

这种用法:

mycommand.CommandText = theQueryAbove;
mycommand.Parameters.AddWithValue("@p1", textbox1.Text);
mycommand.Parameters.AddWithValue("@p2", textbox2.Text);
mycommand.Parameters.AddWithValue("@p3", textbox3.Text);
var rdr = mycommand.ExecuteReader();

最好的解决方案可能是构建一个基于相关文本框的参数化查询,该查询仅包含相关文本框的参数。 Name LIKE @p1 可以比(@p1 = '' OR Name LIKE @p1) 快​​; MySQL 优化器可能会根据 @p1 值自动对其进行简化,但它仍可能会影响它可能优化此类查询的其他方式。

【讨论】:

  • 你好!我使用了您的代码,但它告诉我必须打开连接。但是写的是 con.Open();
  • 该命令应该使用打开的连接创建,或者通过将连接传递给它的构造函数或者使用连接的创建命令方法。
猜你喜欢
  • 2017-05-19
  • 2018-08-24
  • 2011-07-07
  • 2021-07-21
  • 2014-02-16
  • 2018-04-11
  • 2012-07-14
  • 2019-03-12
  • 2014-06-06
相关资源
最近更新 更多