C#调用SQLClient执行UPDATE时varchar转datetime值越界错误如何解决
问题根因
你遇到的报错根本不是UPDATE语句SET部分的参数绑定问题,而是ToWhere()方法直接将DateTime对象通过字符串插值拼接进SQL语句导致的:
当你用$"WHERE [StartDateTime] = '{StartDateTime}'"这种写法时,C#会自动调用StartDateTime.ToString()方法,使用当前程序运行环境的默认区域性格式输出日期字符串,你的源数据是en-GB格式,默认ToString输出是dd/MM/yyyy样式,而SQL Server的datetime类型默认按MM/dd/yyyy解析时,只要日期中的日部分大于12,就会被识别为无效月份,直接触发越界转换报错。
修复方案
- 最优方案:彻底废弃SQL语句字符串拼接逻辑,WHERE子句的所有条件值全部使用参数绑定实现,和你SET部分、之前正常运行的SELECT查询的写法保持一致,既可以彻底解决日期转换问题,还能避免SQL注入风险。
- 临时兼容方案:如果暂时无法调整参数绑定逻辑,将拼接用的DateTime值统一转换为SQL Server无歧义的格式字符串再拼接:
// 转换为ISO8601格式,SQL Server无论区域设置都能正确解析 string safeStartDate = StartDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff"); $"WHERE [StartDateTime] = '{safeStartDate}' ......" - 额外检查项:确认你写入的
newStartDate值在SQL Server datetime类型的支持范围内(1753-01-01 ~ 9999-12-31),超出该范围的值即使使用参数绑定也会触发转换报错。
内容的提问来源于stack exchange,提问作者Swyfte
相关产品推荐
相关产品推荐

