VBA向SQL Server更新日期报错:字符串转日期/时间失败
解决VBA更新SQL Server时日期转换失败的问题
问题原因
直接将Excel单元格的日期值拼接成SQL字符串时,VBA会按本地系统格式生成日期字符串(比如yyyy年mm月dd日或mm/dd/yyyy),而SQL Server无法识别这类非标准格式,导致转换报错。
两种修复方案
方案1:格式化日期为SQL兼容字符串
使用VBA的Format函数将日期转换成SQL Server可识别的yyyy-MM-dd HH:mm:ss格式,同时去掉日期字段的N'前缀(N用于Unicode字符串,日期类型不需要)。
修改后的代码:
querytxt = "update TABLE set dateplan='" & _ Format(Sh.Cells(cl.Row, Range("Table[Date Planned]").Column).Value, "yyyy-MM-dd HH:mm:ss") & "'" & _ " where ID='" & Sh.Cells(cl.Row, Range("Table[ID]").Column) & "'"
方案2:使用参数化查询(推荐)
参数化查询能避免SQL注入风险,同时让数据库驱动自动处理日期类型转换,无需手动格式化字符串,可靠性更高。
示例代码:
' 可引用Microsoft ActiveX Data Objects库,或使用后期绑定 Dim cmd As Object Set cmd = CreateObject("ADODB.Command") ' 绑定已打开的数据库连接对象 cmd.ActiveConnection = yourConnection cmd.CommandText = "update TABLE set dateplan = @DatePlanned where ID = @ID" ' 添加参数:按实际字段类型调整参数属性 cmd.Parameters.Append cmd.CreateParameter("@DatePlanned", 7, 1, , Sh.Cells(cl.Row, Range("Table[Date Planned]").Column).Value) cmd.Parameters.Append cmd.CreateParameter("@ID", 200, 1, 50, Sh.Cells(cl.Row, Range("Table[ID]").Column).Value) ' 执行更新操作 cmd.Execute Set cmd = Nothing
注:参数类型常量说明:7对应adDate,200对应adVarChar,1对应adParamInput;ID的长度(示例中为50)可根据实际字段长度调整。
内容的提问来源于stack exchange,提问作者SSss0011
相关产品推荐
相关产品推荐

