筛选两日期间数据遇System.Data.SqlClient.SqlException日期转换超范围错误
解决SQL Server日期转换超出范围的问题
嗨,我来帮你搞定这个烦人的转换错误!你遇到的System.Data.SqlClient.SqlException: varchar数据类型转换为datetime数据类型时导致超出范围问题,根源出在直接把日期控件的字符串结果拼进SQL语句的写法上,咱们一步步解决:
问题核心原因
- 日期格式不兼容:
dateTimePicker1.Value.ToString()会按照你本地系统的日期格式生成字符串(比如dd/MM/yyyy),但SQL Server默认的日期解析格式可能是MM/dd/yyyy,当你的日期日份大于12时(比如13号),SQL就会把它当成月份,自然超出范围报错。 - 严重的安全风险:这种字符串拼接写法存在SQL注入漏洞,恶意用户可以通过构造特殊日期值篡改你的SQL语句,窃取或破坏数据。
正确解决方案:使用参数化查询
参数化查询是处理数据库日期类型的标准做法,它会自动处理类型转换,完全避免格式问题和注入风险。修改后的代码如下:
// 用using语句自动管理数据库连接资源,避免泄漏 using (SqlConnection con = new SqlConnection("你的数据库连接字符串")) { con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; // 用@参数占位符代替直接拼接字符串 cmd.CommandText = @"SELECT daytime AS DATE, COLUMN_2 AS SHIFT, COLUMN_3 AS 'PART NO', COLUMN_4 AS 'PART NAME', BSNO AS 'BASKET NUMBER', Spare1 AS MATERIAL, CAS6 AS 'CASCADE RINSE 6 TIME (sec)', DRY AS 'DRYER TIME (sec)', TEMP1 AS 'DRYER TEMP (°c)' FROM Table_2 WHERE daytime BETWEEN @StartDate AND @EndDate"; // 直接传入DateTime类型值,SQL会自动处理类型转换 cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = dateTimePicker1.Value; cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = dateTimePicker2.Value; DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); metroGrid1.DataSource = dt; // using块结束时会自动关闭连接,无需手动调用con.Close() }
额外优化建议
- 如果你的
daytime字段是SQL Server的datetime2类型,把参数类型改成SqlDbType.DateTime2会更匹配,避免不必要的类型转换。 - 永远不要用字符串拼接的方式构造包含用户输入(或控件值)的SQL语句,参数化是唯一安全可靠的做法。
内容的提问来源于stack exchange,提问作者Annisha
相关产品推荐
相关产品推荐

