VB.NET操作SQL Server执行查询时遇日期/时间字符串转换失败错误
解决VB.NET中SQL Server日期转换错误的问题
你碰到的这个Conversion failed when converting date and/or time from character string错误,核心原因是直接拼接日期字符串到SQL语句里,导致格式和SQL Server的预期不匹配——而且这种字符串拼接的写法还存在严重的SQL注入风险,这是绝对要避免的不良实践。
最优解决方案:使用参数化查询
参数化查询是处理数据库交互的标准做法,它既能彻底解决日期格式转换的问题,又能杜绝SQL注入攻击。具体实现步骤如下:
- 先定义带参数占位符的SQL语句,不要直接拼接变量值
- 为每个占位符创建对应的
SqlParameter,把控件的值绑定到参数上 - 让
SqlDataAdapter自动处理类型转换,无需手动转字符串
给你写好的示例代码:
' 定义带参数占位符的SQL查询语句 Dim query As String = "SELECT * FROM UserComeView WHERE ComeUserFullName = @ComeUserFullName AND ComeDate BETWEEN @StartDate AND @EndDate" ' 初始化SqlDataAdapter并关联连接 da = New SqlDataAdapter(query, sql.sqlcon) ' 逐个添加参数,确保参数类型和数据库字段类型匹配 da.SelectCommand.Parameters.Add("@ComeUserFullName", SqlDbType.NVarChar).Value = cmb_user.SelectedValue da.SelectCommand.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = Date1.Value da.SelectCommand.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = Date2.Value
为什么参数化查询能解决问题?
SQL Server会直接接收日期类型的参数值,不需要把日期转成字符串再解析,完全规避了不同区域格式导致的转换错误。同时,参数化查询会自动处理特殊字符,从根源上防止SQL注入。
不推荐的临时 workaround(仅作了解)
如果因为某些原因必须用字符串拼接(强烈不建议),你可以把日期转换成SQL Server能识别的ISO 8601标准格式(yyyy-MM-dd HH:mm:ss),确保格式统一:
' 把日期转成标准格式字符串 Dim startDateStr As String = Date1.Value.ToString("yyyy-MM-dd HH:mm:ss") Dim endDateStr As String = Date2.Value.ToString("yyyy-MM-dd HH:mm:ss") ' 注意这里要给字符串类型的ComeUserFullName加单引号(但依然有注入风险) da = New SqlDataAdapter($"select * from UserComeView where ComeUserFullName='{cmb_user.SelectedValue}' and ComeDate between '{startDateStr}' and '{endDateStr}'", sql.sqlcon)
再次强调:这种方法只是临时凑合用,存在严重的安全隐患,生产环境绝对要用参数化查询。
内容的提问来源于stack exchange,提问作者Yahya Aladimi
相关产品推荐
相关产品推荐

