Vb.Net结合MySQL按日期与ComboBox值筛选数据的SQL语法错误问题
报错翻译
原英文报错:
Additional information: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE date(dateprocessed) between '2021-09-20' and '2021-09-25' WHERE projectcode' at line 1
中文含义:
附加信息:你的SQL语法存在错误,请查询与你使用的MySQL版本对应的官方手册,确认LIKE date(dateprocessed) between '2021-09-20' and '2021-09-25' WHERE projectcode片段附近的语法是否正确
错误原因
- SQL语句结构不符合MySQL规范:
SELECT * FROM 表名后需直接跟WHERE关键字声明过滤条件,你错误的将日期判断逻辑、多余的LIKE关键字放在了WHERE之前 - 多重过滤条件需要用
AND关键字拼接在WHERE子句内,不能分散写在WHERE前后 - 直接拼接用户输入构造SQL的写法存在SQL注入风险,输入内容含特殊字符时也会触发语法错误
修复代码
推荐使用参数化查询写法,完全避免语法错误和注入风险:
' 构造参数化SQL语句,不直接拼接用户输入 Dim querySql As String = "SELECT * FROM loins WHERE DATE(dateprocessed) BETWEEN @startDate AND @endDate AND projectcode = @projectCode ORDER BY code ASC" adapter.SelectCommand = New MySqlCommand(querySql, conn.getConnection) ' 给参数赋值,自动处理类型转义 adapter.SelectCommand.Parameters.AddWithValue("@startDate", DateTimePicker1.Value.ToString("yyyy-MM-dd")) adapter.SelectCommand.Parameters.AddWithValue("@endDate", DateTimePicker2.Value.ToString("yyyy-MM-dd")) adapter.SelectCommand.Parameters.AddWithValue("@projectCode", ComboBox1.Text)
补充说明
如果需要对projectcode做模糊匹配,将条件projectcode = @projectCode改为projectcode LIKE CONCAT('%', @projectCode, '%')即可,其他逻辑无需改动。
内容的提问来源于stack exchange,提问作者Abd Domingos
相关产品推荐
相关产品推荐

