You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET操作SQL Server执行查询时遇日期/时间字符串转换失败错误

解决VB.NET中SQL Server日期转换错误的问题

你碰到的这个Conversion failed when converting date and/or time from character string错误,核心原因是直接拼接日期字符串到SQL语句里,导致格式和SQL Server的预期不匹配——而且这种字符串拼接的写法还存在严重的SQL注入风险,这是绝对要避免的不良实践。

最优解决方案:使用参数化查询

参数化查询是处理数据库交互的标准做法,它既能彻底解决日期格式转换的问题,又能杜绝SQL注入攻击。具体实现步骤如下:

  1. 先定义带参数占位符的SQL语句,不要直接拼接变量值
  2. 为每个占位符创建对应的SqlParameter,把控件的值绑定到参数上
  3. 让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:42:41