使用ADO.NET按日期筛选数据填充DataGridView时报类型转换错误如何解决
问题原因
- 日期字符串格式错误:你定义的
dmy、dmyplus变量值为'2021/21/11'、'2021/22/11',按常用的年/月/日格式解析时,21、22作为月份取值超出1~12的合法范围,SQL Server尝试将该varchar值转为datetime类型时触发越界错误。如果你的本意是筛选2021年11月21日到22日的数据,日期的月、日位置写反了。 - 字符串拼接SQL的方式本身存在缺陷:不同数据库、不同区域配置的日期解析规则不一致,手动拼接的字符串很容易出现格式不匹配的转换错误,同时还存在SQL注入的安全风险。
解决方案
方案1:使用参数化查询(推荐)
直接传DateTime类型的参数,无需手动处理日期字符串格式,ADO.NET会自动完成类型匹配,完全避免转换错误和SQL注入问题,同时自动释放数据库连接资源,示例代码如下:
// 直接定义DateTime类型的日期变量,不用手动拼接带引号的字符串 DateTime dmy = new DateTime(2021, 11, 21); DateTime dmyplus = new DateTime(2021, 11, 22); string query1 = "Select * from buy Where [date] >= @dmy and [date] < @dmyplus"; using (SqlConnection connection1 = new SqlConnection(ConnetionPath4)) { SqlDataAdapter adapter1 = new SqlDataAdapter(query1, connection1); // 给SQL语句添加参数,自动匹配DateTime类型 adapter1.SelectCommand.Parameters.AddWithValue("@dmy", dmy); adapter1.SelectCommand.Parameters.AddWithValue("@dmyplus", dmyplus); DataTable data1 = new DataTable(); adapter1.Fill(data1); // 后续绑定DataGridView的逻辑不变 }
方案2:修正日期字符串格式(仅临时验证用,不推荐生产环境使用)
如果要继续用字符串拼接的方式,先把日期调整为SQL Server通用的yyyy-MM-dd标准格式,修正后的变量定义如下:
var dmy = "'2021-11-21'"; var dmyplus = "'2021-11-22'";
内容的提问来源于stack exchange,提问作者benyamin dashtestani
相关产品推荐
相关产品推荐

