如何使用VBA中的datetime参数调用SQL Server存储过程?

时间:2016-06-13 10:09:32

标签: sql-server excel vba excel-vba datetime

我有一个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

但是我收到了这个错误:

enter image description here

我该如何解决?

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

enter image description here

1 个答案:

答案 0 :(得分: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的索引更直观&#34;

的基本原理是错误的。

当开发ADO时,我相信微软意识到基于1的集合是一个错误,并决定将ADO集合设为0。这使得它们与标准集合不一致,但是更直观&#34;比方说,javascript开发人员。多么不一致的混乱。

如果我是对的(自从我使用ADO以来已经很长时间了,我还没有对此进行测试),那么你需要:

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

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

相关问题