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

VBA ADO向SQL Server插入数据时adDate参数无法传递日期的问题

解决VBA通过ADO参数传递日期到SQL Server的问题

问题根源

你的代码里CreateParameter方法的参数顺序错误,导致日期参数没有被正确赋值,最终传递了Null值到SQL Server。CreateParameter的第四个参数是size(长度),仅针对字符串/二进制类型有效,adDate类型不需要指定该参数;日期值应该放在第五个参数的位置。

正确的类型组合与代码

  • VBA变量类型:使用原生的Date类型,这是与SQL Server date/datetime类型最匹配的类型,无需转换为字符串,避免区域格式问题。
  • ADO参数类型:使用adDate,与SQL Server的date类型完全兼容。

修正后的代码:

Dim TDate As Date
' 推荐用DateSerial或CDate明确赋值,避免隐式转换问题
TDate = DateSerial(2025, 3, 7)
' 或者 TDate = CDate("2025-03-07")

Call mDataBase.Open("Provider=SQLOLEDB;Initial Catalog=" & pCatalog & ";Data Source=" & pServer & ";Integrated Security=SSPI")
mCmd.ActiveConnection = mDataBase

With mCmd
    .CommandText = "INSERT INTO testJournal ( City, JDate ) VALUES(?,?)"
    ' 先设置CommandText,再添加参数(可选,但更规范)
    .Parameters.Append .CreateParameter("City", adLongVarChar, adParamInput, 100, "Beaumont")
    ' adDate不需要指定size,第四个参数传0或省略,第五个参数传日期值
    .Parameters.Append .CreateParameter("JDate", adDate, adParamInput, 0, TDate)
End With

Set mRS = mCmd.Execute

额外注意事项

  • 确保ADO参数的顺序与SQL语句中VALUES(?,?)的占位符顺序完全对应,参数名不影响匹配,顺序才是关键。
  • 赋值日期时,优先使用DateSerial(year, month, day)或CDate()显式转换,避免直接赋值字符串可能带来的区域格式冲突(比如不同系统对mm/dd/yyyy和dd/mm/yyyy的解析差异)。
  • 如果你使用的是较新的SQL Server Native Client驱动(比如SQLNCLI11),也可以用adDBDate参数类型,效果与adDate一致,都是适配SQL Server的date类型。

内容的提问来源于stack exchange,提问作者Frank Zappa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:53:21