C#使用string.Format拼接SQL时第二个单引号无法显示问题求解
C#拼接SQL语句缺失末尾单引号问题排查
核心原因排查
- 大概率是你传入的
currentIngredentFromList变量末尾携带了\0空终止符:C#本身的字符串是带长度标识的,但调试器、日志输出等工具遇到\0会默认识别为字符串结束,你拼接在后面的单引号刚好在\0之后,就会被截断看不到。
排查方法:断点查看currentIngredentFromList.Length,如果长度比你肉眼看到的字符串长度多1,就可以确认是这个问题。
修复方法:先清理变量里的空字符再拼接:currentIngredentFromList = currentIngredentFromList.TrimEnd('\0'); string commandString = string.Format("Select* from dbo.tblIndiviualFoods where foodName = '{0}'", currentIngredentFromList); - 次要排查方向:检查生成
commandString之后,是否有调用Substring、Remove、Replace等修改字符串的操作,意外删掉了末尾的单引号。
最优实践建议
不要用字符串拼接的方式生成SQL语句,不仅容易出现单引号转义问题,还存在SQL注入风险,推荐使用参数化查询:
// 假设你用的是SqlClient using (SqlCommand cmd = new SqlCommand("Select * from dbo.tblIndiviualFoods where foodName = @FoodName", yourDbConnection)) { cmd.Parameters.AddWithValue("@FoodName", currentIngredentFromList); // 后续执行查询逻辑即可 }
参数化查询会自动处理特殊字符转义,完全不需要手动处理单引号,同时可以避免注入风险。
内容的提问来源于stack exchange,提问作者Alex West
相关产品推荐
相关产品推荐

