![](/img/trans.png)
[英]Datetime parameter format from Crystal Reports to SQL Server stored procedure
[英]How to call SQL Server stored procedure with datetime parameter from VBA?
我有一个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的建议之后,我打开了调试器并得到了它,但是错误仍然存在:
使用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 = ...
我认为以上是错误的。 从1开始对标准VB / VBA集合进行索引。我认为,基于我的观点的误解是基于1的索引“更直观”。
在开发ADO时,我相信Microsoft意识到基于1的集合是一个错误,因此决定使ADO集合基于0。 这使它们与标准集合不一致,但对javascript开发人员来说“更直观”。 真是一团糟。
如果我是对的(并且自从使用ADO已经很长时间了,并且还没有测试过),那么您需要:
spCommand.Parameters(1).Value = ...
spCommand.Parameters(2).Value = ...
这样可以消除3265错误,但不能解决您原来的问题。 您的调试跟踪显示似乎已将参数设置为预期值。 我只能建议您尝试生成MCVE ,包括所讨论的存储过程的简化版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.