правильный способ передачи в виде строки в CreateParameter - PullRequest
2 голосов
/ 27 января 2011

Если я вызываю хранимую процедуру с помощью

DECLARE @return_value int

EXEC @return_value = [dbo].[GetValueProc]
  @startDate = '1/1/2010',
  @endDate = '12/31/2010',  
  @groupNo = N'02'
SELECT 'Return Value' = @return_value

Из командного окна sql она прекрасно работает, но при использовании VB6 возвращает пустой набор записей.

Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cn

cmd.CommandText = "GetValueProc"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@startDate", adDate, adParamInput, 0, startDate)
cmd.Parameters.Append cmd.CreateParameter("@endDate", adDate, adParamInput, 0, endDate)
cmd.Parameters.Append cmd.CreateParameter("@groupNo", adVarChar, adParamInput, 3, "02")

Set RstRecordSet = New ADODB.Recordset
With RstRecordSet        
  .CursorType = adOpenStatic
  .CursorLocation = adUseClient
  .LockType = adLockOptimistic
  .Open cmd
End With

Я получаю пустуюНабор записей от VB.Однако из окна командной строки sql все работает как положено.

Примечание: если я закомментирую строку с соответствующим параметром, она также будет работать как положено.

хранимая процедура выглядит следующим образом:

ALTER PROCEDURE [dbo].[GetValueProc] 
@startDate as date,
@endDate as date,
@proposalNo nvarchar(30) = null, 
@groupNo nvarchar(3) = null

select...
where ...
   and j.[Global Dimension 1 Code] = COALESCE(@groupNo,[Global Dimension 1 Code])

[Код глобального измерения 1] - это varchar (20)

Я также пытался

cmd.Parameters.Append cmd.CreateParameter("@groupNo", adVarChar, adParamInput, 4, "'02'")

не помогает.

ЛюбойСправка о правильном способе передачи параметра будет отличной!

Спасибо

1 Ответ

3 голосов
/ 28 января 2011

Замечу, что вы пропускаете параметр @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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...