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

我有一个SQL Server存储过程接受datetime数据types的两个input参数。 我想从Excel VBA中调用它。

VBA没有date时间types,所以我尝试了这样的事情:

 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
在遵循@Joebuild议的内容之后,我打开了我的debugging器并得到了这个,但是错误仍然存​​在:

在这里输入图像说明

使用DateSerial函数:

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

如果你需要,可以selectTimeSerial函数:

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

VBA没有date时间types

是的,它确实:

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

UPDATE

在您编辑之后,我看到参数集合有三个项目。 第一个是返回参数,第二个和第三个是adDBTimeStamptypes的input参数。

此外, Command.NamedParameters属性为false,因此您可能无法使用命名参数,因为您似乎正试图在随附编辑的屏幕截图中执行此操作。

更新2

VBA集合索引从1开始,而不是0,所以你应该指定你的参数为:

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

我认为以上是错误的。 标准的VB / VBA集合从1开始索引。我认为我错误的理由是基于1的索引是“更直观的”。

当开发ADO时,我相信微软意识到基于1的集合是一个错误,并且决定使ADO集合为0。 这使得它们与标准集合不一致,但对于JavaScript开发人员来说更“直观”。 什么不一致的混乱。

如果我是对的(从使用ADO开始已经很长时间了,而且我还没有testing过),那么你需要:

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

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