繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM