MariaDB抛出MySqlException:SQL语法错误的原因及解决方法?
MySQL语法错误异常的含义与解决方案
异常含义
这个MySqlException属于SQL语法错误,错误提示里的near '= 'a'%'明确指向问题:
LIKE本身是模糊匹配的比较运算符,你多写了一个多余的=,导致语法结构混乱- 直接在参数
@name后拼接%的写法不符合参数化查询规则,数据库无法正确解析这条SQL语句
解决方法
1. 修正SQL核心语法错误
去掉LIKE后的=,并通过正确方式处理通配符%,推荐两种可靠写法:
- 在参数值中拼接通配符
- 在SQL语句里用
CONCAT函数拼接参数与通配符
2. 修正后的代码示例
方式一:参数值拼接通配符
public void searchProduct(DataGridView data, TextBox searchString) { connection.Open(); // 移除LIKE后的=,SQL中仅保留参数占位符 MySqlDataAdapter da = new MySqlDataAdapter("Select id, productName, productType, productQuantity, productPurchasePrice, productPurchaseDate, productSalePrice, productTax from products where productName like @name", connection); // 在参数值中加入%,实现前缀模糊匹配 da.SelectCommand.Parameters.AddWithValue("@name", $"{searchString.Text}%"); DataTable dt = new DataTable(); da.Fill(dt); data.DataSource = dt; connection.Close(); }
方式二:SQL中使用CONCAT函数
public void searchProduct(DataGridView data, TextBox searchString) { connection.Open(); // 移除LIKE后的=,用CONCAT拼接参数和通配符 MySqlDataAdapter da = new MySqlDataAdapter("Select id, productName, productType, productQuantity, productPurchasePrice, productPurchaseDate, productSalePrice, productTax from products where productName like CONCAT(@name, '%')", connection); da.SelectCommand.Parameters.AddWithValue("@name", searchString.Text); DataTable dt = new DataTable(); da.Fill(dt); data.DataSource = dt; connection.Close(); }
额外优化建议
用using语句管理数据库资源,避免连接未关闭或资源泄漏:
public void searchProduct(DataGridView data, TextBox searchString) { using (var conn = new MySqlConnection(connection.ConnectionString)) { conn.Open(); using (MySqlDataAdapter da = new MySqlDataAdapter("Select id, productName, productType, productQuantity, productPurchasePrice, productPurchaseDate, productSalePrice, productTax from products where productName like CONCAT(@name, '%')", conn)) { da.SelectCommand.Parameters.AddWithValue("@name", searchString.Text); DataTable dt = new DataTable(); da.Fill(dt); data.DataSource = dt; } } }
内容的提问来源于stack exchange,提问作者Kamil MERT
相关产品推荐
相关产品推荐

