C# DateTime解析提取时间失败及SQL查询格式报错问题求助
C# DateTime解析与SQL查询格式问题解决方案
核心问题定位
- 你调用
dt.ToString("hh:mm:ss tt");后没有接收返回值:DateTime是值类型,ToString()方法不会修改原变量本身,你后续拼接SQL用到的dt还是完整的DateTime结构,默认调用无参ToString()时会输出系统当前区域文化对应的完整日期时间格式。 - 直接拼接SQL字符串属于高危操作,除了存在SQL注入风险外,日期格式完全依赖程序运行时的区域文化设置,格式不稳定就是你前14次循环正常、后续报错的核心原因:大概率前14次的日期中日部分≤12,不同区域的月/日顺序解析没有冲突,到第15次日部分超过12后,数据库无法识别错位的月/日格式,直接抛出异常。
修复建议
最优方案:使用参数化查询(彻底解决格式问题)
完全不需要手动处理日期格式,由ADO.NET自动完成类型匹配,同时规避SQL注入风险,示例代码如下:
// 按需调整参数类型适配你的数据库字段: // 如果数据库StartTime是time类型,传dt.TimeOfDay // 如果StartTime是datetime类型仅需匹配时间部分,可调整SQL语句对字段做时间转换 string querySql = "SELECT * FROM [***].[***].[****] WHERE Id = @Id AND StartTime = @StartTime"; using (SqlCommand command = new SqlCommand(querySql, yourDbConnection)) { command.Parameters.AddWithValue("@Id", Id); // 若StartTime为time类型: command.Parameters.AddWithValue("@StartTime", dt.TimeOfDay); // 若StartTime为datetime类型仅需匹配时间: // command.Parameters.AddWithValue("@StartTime", dt.ToString("HH:mm:ss")); // 或调整SQL为 WHERE Id = @Id AND CAST(StartTime AS time) = @TimeParam // 执行查询逻辑 }
临时方案:手动控制时间字符串输出(仅推荐调试用,不建议生产环境拼接SQL)
如果确实需要生成时间字符串,必须接收ToString()的返回值,同时指定固定格式:
// HH为24小时制,hh为12小时制,按需选择 string timePart = dt.ToString("HH:mm:ss"); // 拼接SQL时强制用不变文化避免格式漂移 string querySql = $"SELECT * FROM [***].[***].[****] WHERE Id = {Id} AND StartTime = '{dt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)}'";
内容的提问来源于stack exchange,提问作者jlfish1997
相关产品推荐
相关产品推荐

