我有一个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建议的内容之后,我打开了我的调试器并得到了这个,但错误仍然存在:
答案 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,包括相关存储过程的简化版本。