VBA ADO向SQL Server插入数据时adDate参数无法传递日期的问题
解决VBA通过ADO参数传递日期到SQL Server的问题
问题根源
你的代码里CreateParameter方法的参数顺序错误,导致日期参数没有被正确赋值,最终传递了Null值到SQL Server。CreateParameter的第四个参数是size(长度),仅针对字符串/二进制类型有效,adDate类型不需要指定该参数;日期值应该放在第五个参数的位置。
正确的类型组合与代码
- VBA变量类型:使用原生的
Date类型,这是与SQL Serverdate/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
相关产品推荐
相关产品推荐

