【问题标题】:How to use LIKE for type int and data [duplicate]如何将 LIKE 用于 int 类型和数据 [重复]
【发布时间】:2019-04-27 15:42:36
【问题描述】:

我有一个数据库(SQL 服务器),其中有一个学生表,其中有字段名称(nvarchar(50))、年龄(int)和生日(日期)。我在 C# windows 窗体中添加了这个数据库。我按名称搜索:

bindingSource.Filter = "Name LIKE'" + textBox5.Text + "%'";

而且效果很好。但这不适用于 Age 字段:

bindingSource.Filter = "Age LIKE'" + Convert.ToInt32(textBox5.Text) + "%'";

其他人可以知道如何为生日字段做同样的事情吗?

【问题讨论】:

  • 在任何事情之前,停止注入你的价值观。始终参数化您的查询。您现在拥有的是一个巨大的安全漏洞。
  • 年龄是整数,不能和字符串比较。您可能应该将 Age 列转换/转换为字符串并进行比较。
  • 关于您的问题,您不能对数字数据类型使用LIKE,它必须是字符串类型。你在这里的最终目标是什么?似乎您应该改用 BETWEEN 逻辑。我假设你真的想要AGE BETWEEN 30 AND 39Age >= 30 AND Age < 40,而不是Age LIKE '3%'
  • 如果我是你的导师,我会通过搜索名字类似于';DROP TABLE Students;--的学生来测试你的代码
  • 或者你可以把你的儿子“小鲍比桌”送到学校@DanGuzman ???? xkcd.com/327

标签: c# sql-server winforms


【解决方案1】:

对于数字列,使用等于=。如果您确实想通过部分值搜索Age,那么您需要先将其转换为字符值。

studentsBindingSource.Filter = "CAST([Age] AS varchar) LIKE '" + Convert.ToInt32(textBox3.Text) + "%'";`

请务必先验证用户是否在 textBox3 中输入了数值。

请注意,我只是直接回答您的问题。使用参数化查询可以防止 SQL 注入攻击,应该是首选的处理方式。

【讨论】:

  • 这仍然是在注入值(尽管至少一个整数是一个“安全(r)”值;但并没有解决(名称不好的)textbox5 的问题。
  • 输入验证很好,但参数化查询更好。
猜你喜欢
  • 2020-10-22
  • 2020-06-24
  • 2018-08-13
  • 1970-01-01
  • 2022-12-04
  • 2016-06-25
  • 2021-08-12
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多