Замечу, что вы пропускаете параметр @proposalNo
в вызове.Поэтому, я думаю, вам нужно указать, что вы используете именованные параметры, в противном случае они будут считаться в порядковом порядке, т.е. @groupNo
в вызове является третьим в коллекции Parameters
и, следовательно, будет использоваться для третьегопараметр в хранимой процедуре, который на самом деле @proposalNo
.
Попробуйте вставить эту строку
cmd.NamedParameters = True
непосредственно перед cmd.Parameters.Append...
строками.Обратите внимание, что только более поздние версии ADO (например, 2.8) поддерживают именованные параметры.
Вот повтор:
Во-первых, измените ваш сохраненный процесс, чтобы просто выбрать параметры, например
ALTER PROCEDURE [dbo].[GetValueProc]
@startDate as date,
@endDate as date,
@proposalNo nvarchar(30) = null,
@groupNo nvarchar(3) = null
AS
BEGIN
SELECT @startDate, @endDate, @proposalNo, @groupNo;
END;
Во-вторых, попробуйте этот VBA (нужно изменить его для строки подключения), который исправляет ваши опечатки:
Sub hngorhio()
Dim cmd As New ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = "Your connection string here"
cmd.CommandText = "GetValueProc"
cmd.CommandType = adCmdStoredProc
cmd.NamedParameters = True ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< '
cmd.Parameters.Append _
cmd.CreateParameter("@startDate", adDate, adParamInput, 0, Date)
cmd.Parameters.Append _
cmd.CreateParameter("@endDate", adDate, adParamInput, 0, Date + 1)
cmd.Parameters.Append _
cmd.CreateParameter("@groupNo", adVarChar, adParamInput, 3, "02")
Dim RstRecordSet As New ADODB.Recordset
Set RstRecordSet = New ADODB.Recordset
With RstRecordSet
.CursorType = adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open cmd
If Not .EOF Then
MsgBox .GetString(, , , , "<NULL>")
End If
End With
End Sub
Если вы прокомментируете и раскомментируете строки NamedParameters
, вы увидите 02
и<NULL>
переключает места в окне сообщения, доказывая, что механизм SQL использует порядковый номер параметров, когда NamedParameters
не включен.
ОБНОВЛЕНО:
Возможно, этот хранимый процесс дает более явныйрезультат с тем же кодом VBA выше:
ALTER PROCEDURE [dbo].[GetValueProc]
@startDate as date,
@endDate as date,
@proposalNo nvarchar(30) = null,
@groupNo nvarchar(3) = null
AS
BEGIN
SELECT '@proposalNo = ' + COALESCE(@proposalNo, '<NULL>') + CHAR(10)
+ '@groupNo = ' + COALESCE(@groupNo, '<NULL>');
END;