【问题标题】:How to call SQL Server stored procedure with datetime parameter from VBA?如何使用 VBA 中的 datetime 参数调用 SQL Server 存储过程?
【发布时间】:2016-10-13 17:02:18
【问题描述】:

我有一个 SQL Server 存储过程,它接受两个 datetime 数据类型的输入参数。我想从 Excel VBA 中调用它。

VBA 没有日期时间类型,所以我尝试了这样的方法:

Dim spCommand As ADODB.Command
Set spCommand = New ADODB.Command
spCommand.ActiveConnection = cnn
spCommand.CommandText = "myProcedureName"
spCommand.CommandType = adCmdStoredProc
spCommand.Parameters.Refresh
spCommand.Parameters(1).Value = "6/1/2016"      'DateValue("2016-06-01") + TimeValue("00:00:00")
spCommand.Parameters(2).Value = "6/1/2016"     'DateValue("2016-06-01") + TimeValue("23:59:59")
spCommand.Execute

但我收到此错误:

我该如何解决?

编辑 1
在遵循@Joe 的建议后,我打开了调试器并得到了这个,但错误仍然存​​在:

【问题讨论】:

  • 您尝试过用# 包围的日期吗?例如2016 年 6 月 1 日,将是 #6/1/2016#。
  • @RyanWildry。是的,我做到了
  • @RyanWildry - 查看更新的答案

标签: sql-server vba excel datetime


【解决方案1】:

使用 DateSerial 函数:

spCommand.Parameters(1).Value = DateSerial(2016,1,6)

如果需要,还可以选择 TimeSerial 函数:

spCommand.Parameters(2).Value = DateSerial(2016,1,6) + TimeSerial(23,59,59)

VBA 没有日期时间类型

是的,确实如此:

Dim dtDateTime as Date
dtDateTime = DateSerial(2016,1,6) + TimeSerial(23,59,59)

更新

在您进行编辑后,我看到 Parameters 集合包含三个项目。第一个是返回参数,第二个和第三个是adDBTimeStamp类型的输入参数。

此外,Command.NamedParameters 属性为 false,因此您可能无法使用命名参数,就像您在编辑随附的屏幕截图中尝试的那样。

更新 2

VBA 集合的索引从 1 开始,而不是 0,因此您应该将参数指定为:

spCommand.Parameters(2).Value = ...
spCommand.Parameters(3).Value = ...

我认为上面是错误的。标准 VB/VBA 集合从 1 开始编入索引。我认为在我看来错误的基本原理是基于 1 的索引“更直观”。

在开发 ADO 时,我相信 Microsoft 意识到基于 1 的集合是一个错误,并决定使 ADO 集合基于 0。这使得它们与标准集合不一致,但对 javascript 开发人员来说“更直观”。真是一团糟。

如果我是对的(而且我使用 ADO 已经很久了,我还没有测试过),那么你需要:

spCommand.Parameters(1).Value = ...
spCommand.Parameters(2).Value = ...

这应该可以消除您的 3265 错误,但不能解决您原来的问题。您的调试跟踪似乎显示参数已设置为预期值。我只能建议您尝试生成MCVE,包括相关存储过程的简化版本。

【讨论】:

  • 谢谢@Joe,但这对我不起作用!我得到同样的错误。
  • @baudo2048 - 80040e14 是一般错误。尝试在调试器下运行,调用 refresh 后检查参数集合,确保数据类型符合您的预期。
  • 我已经尝试了您在更新中的建议,但它不起作用,我收到另一个错误:运行时错误“3265”。我赞成您的回答,因为它解决了日期时间问题。我认为还有别的东西,也许是为了解决这个问题而犯的一个愚蠢的错误。第一个@RETURN_VALUE 很奇怪,我的存储过程没有返回任何值。谢谢
猜你喜欢
  • 2021-04-30
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多