MSSQL Server DateTime字段更新失败,ASP.NET MVC传参报错咨询
解决SQL Server日期更新的语法错误问题
嘿,这个问题我太熟了!你遇到的报错完全是因为直接把DateTime对象拼进SQL字符串导致的——.NET默认输出的日期格式(比如29.04.2019 15:25:58)在SQL Server眼里根本不是合法的日期值,它会把.当成语法分隔符,所以才会抛出Incorrect syntax near '.2019'的错误。
下面给你两种解决方案,优先推荐第一种:
1. 最佳实践:使用参数化查询(安全+无格式问题)
直接拼接字符串不仅会踩格式坑,还存在SQL注入的巨大风险——万一model.Id是用户可控的输入,恶意攻击者能轻易篡改你的SQL逻辑。参数化查询能同时解决这两个问题,让SQL Server自动处理类型转换:
DateTime lastUpdate = DateTime.Now; // 用占位符代替直接拼接的值 string sql = "UPDATE com.[Ticket] SET Updated = @UpdatedDate WHERE [Id] = @TicketId"; using (SqlConnection conn = new SqlConnection(你的连接字符串)) { conn.Open(); using (SqlCommand cmd = new SqlCommand(sql, conn)) { // 添加参数并赋值,SQL Server会自动处理日期格式 cmd.Parameters.AddWithValue("@UpdatedDate", lastUpdate); cmd.Parameters.AddWithValue("@TicketId", model.Id); // 执行更新 cmd.ExecuteNonQuery(); } }
这种方式完全不需要你手动格式化日期,还能彻底杜绝SQL注入,是生产环境的标准写法。
2. 应急方案:手动格式化日期(不推荐)
如果你暂时没法改用参数化查询,那必须把日期格式化成SQL Server能识别的格式,并且用单引号包裹日期值:
DateTime lastUpdate = DateTime.Now; // 格式化为SQL Server支持的标准格式 string formattedDate = lastUpdate.ToString("yyyy-MM-dd HH:mm:ss"); // 注意给日期加单引号 string sql = $"UPDATE com.[Ticket] SET Updated = '{formattedDate}' WHERE [Id] = {model.Id}";
⚠️ 再次提醒:这种做法依然存在SQL注入风险,只适合临时测试场景,绝不能用在生产环境里。
补充一点:你的Updated字段是datetime类型,SQL Server支持的合法日期格式包括yyyy-MM-dd、yyyyMMdd或者ISO8601格式(比如yyyy-MM-ddTHH:mm:ss),只要用单引号包裹,并且格式正确,就能被正确识别。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

