C#拼接SQL插入日期到评论串更新文件时报'bad'附近语法错误
问题排查结论
你碰到的语法错误有两个核心诱因,另外代码里还有隐藏的运行时bug:
- 直接拼接SQL语句时,字符串类型的
comment值没有做SQL语法转义、也没有用单引号包裹,最终生成的SQL语句实际为:
数据库解析时会先把update dbo.steak set comment=06/03/2022 bad steak where fileid=xxx06/03/2022当成数值除法表达式计算,碰到空格后的bad时无法识别为合法语法,因此直接抛出"'bad'附近语法错误",和你描述的错误位置完全吻合。就算手动给字符串加单引号,只要评论内容包含单引号(比如it's bad)依然会触发语法错误,同时还存在严重的SQL注入风险。 using语句末尾多写了分号,会导致SqlCommand对象在出using块后立刻被释放,后续执行ExecuteNonQuery()时会抛出对象已释放的异常,属于隐藏的运行时bug。- 现有字符串拼接逻辑存在冗余:
dat本身已经是ToString()生成的字符串,无需重复调用ToString();comment = comment += " "的写法属于多余赋值,完全没必要。
修复方案
必须使用参数化查询,禁止直接拼接用户输入内容到SQL语句,修复后的代码如下:
// 直接组装评论内容,去掉冗余的重复赋值和ToString调用 var comment = $"{DateTime.Now:MM/dd/yyyy} {txtComment.Text}{Environment.NewLine}"; // SQL语句中用参数占位符代替直接拼接值 const string updateSql = "update dbo.steak set comment=@Comment where fileid=@FileId"; // 去掉using语句末尾的分号,把执行逻辑放在using的代码块内 using (var command = new SqlCommand(updateSql, sqlConnection)) { // 按占位符名称传入参数,程序自动处理类型匹配、特殊字符转义 command.Parameters.AddWithValue("@Comment", comment); command.Parameters.AddWithValue("@FileId", r2); command.ExecuteNonQuery(); }
参数化查询是操作关系型数据库的标准实践,会自动处理字符串中的单引号、换行、特殊符号等内容,从根源上避免拼接SQL带来的语法错误和注入风险。
内容的提问来源于stack exchange,提问作者dkaveritt
相关产品推荐
相关产品推荐

