You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#拼接SQL插入日期到评论串更新文件时报'bad'附近语法错误

问题排查结论

你碰到的语法错误有两个核心诱因,另外代码里还有隐藏的运行时bug:

  • 直接拼接SQL语句时,字符串类型的comment值没有做SQL语法转义、也没有用单引号包裹,最终生成的SQL语句实际为:
    update dbo.steak set comment=06/03/2022  bad steak where fileid=xxx
    
    数据库解析时会先把06/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:39:25