查询语句提示语法错误但自认正确,附C#检查记录存在方法代码
排查SQL语法错误及代码修正建议
嘿,我帮你看看这个问题,你的代码里有几个明显的语法问题导致了SQL错误,咱们一个个来解决:
1. SQL语句拼接的语法错误
首先看你拼接SQL的这行代码:
string query = "SELECT * FROM " + tableName + " WHERE " + column " = @" + column;
在column变量和后面的" = @"字符串之间缺少了一个加号(+),这会直接导致字符串拼接失败,生成的SQL自然存在语法错误。
修正后的SQL拼接代码应该是:
string query = "SELECT * FROM " + tableName + " WHERE " + column + " = @" + column;
2. MySqlCommand对象创建的语法错误
你创建命令对象的代码也有问题:
MySqlCommand = new MySqlCommand(query, conn);
这里没有声明变量名,正确的写法需要指定一个变量来接收命令对象,比如:
MySqlCommand cmd = new MySqlCommand(query, conn);
另外,你还需要给参数绑定值,不然SQL执行时会因为缺少参数值报错,比如添加:
cmd.Parameters.AddWithValue($"@{column}", id);
3. 额外建议:修复资源泄漏与避免SQL注入
除了语法问题,你的代码还有两个需要优化的点:
- 使用
using语句包裹数据库连接、命令和阅读器对象,确保资源自动释放,避免连接泄漏。 - 直接拼接
tableName和column到SQL语句存在严重的SQL注入风险,建议先对表名和列名做白名单校验,只允许合法的表/列名传入。
完整修正后的代码示例
public bool CheckRecordExist(int id, string tableName, string column) { // 白名单校验:替换成你实际允许的表名和列名 var allowedTables = new List<string> { "Users", "Orders" }; var allowedColumns = new List<string> { "Id", "UserId", "OrderId" }; if (!allowedTables.Contains(tableName) || !allowedColumns.Contains(column)) { throw new ArgumentException("非法的表名或列名"); } string connection = string.Format("Server=localhost; database={0}; UID=root; password=root; SslMode=none; CharSet=utf8;", "myDb"); // 使用using自动释放资源 using (MySqlConnection conn = new MySqlConnection(connection)) { string query = "SELECT * FROM " + tableName + " WHERE " + column + " = @" + column; using (MySqlCommand cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue($"@{column}", id); conn.Open(); // 只需判断是否存在行,不需要读取所有数据 using (MySqlDataReader reader = cmd.ExecuteReader()) { return reader.HasRows; } } } }
内容的提问来源于stack exchange,提问作者cojac
相关产品推荐
相关产品推荐

