0

Я пытаюсь выполнить хранимую процедуру MSSQL из Excel VBA с использованием библиотеки ADODB 2.0 (также существует проблема с аналогичной проблемой 2.8) , которая отправляет результирующий набор, а также возвращаемое значение. Я могу правильно получить результат заданных значений, но не могут получить возвращаемое значениеЯ не могу получить возвращаемое значение хранимой процедуры, которая возвращает результирующий набор, а также возвращаемое значение

Ниже описана процедура VBA используется для этой цели, и это принимает следующие параметры (всегда получает возвращаемое значение как пустые.): db connection, sp name, parameter values string array, db result set, spretval - последний два из параметров

Private Sub execSQLSP(dbcon, spname, paramStrInArray, ByRef dbrs, ByRef spretval) 
Dim cmd As ADODB.Command 
Dim dberrflag As Integer 
Dim dberrdesc As String 
Dim ndx As Long 
Dim paramname As String 
On Error Resume Next 

Set cmd = New ADODB.Command 
Set cmd.ActiveConnection = dbcon 
cmd.CommandText = spname 
cmd.CommandType = adCmdStoredProc 

cmd.Parameters.Append cmd.CreateParameter("retVal", adInteger, _ 
              adParamReturnValue) 

For ndx = 0 To UBound(paramStrInArray) 
    paramname = "param" & ndx 
    cmd.Parameters.Append cmd.CreateParameter(Name:=paramname, _ 
           Type:=adVarChar, Direction:=adParamInput, _ 
           size:=Len(paramStrInArray(ndx)), _ 
           Value:=paramStrInArray(ndx)) 
Next 

Set dbrs = cmd.Execute  
Call getDBerror(dbcon.Errors, dberrflag, dberrdesc) 
If dberrflag = 1 Then 
    MsgBox "DB Error while executing following SQL command and hence stopping." & vbCrLf & _ 
      "SQL Cmd:" & spname & vbCrLf & _ 
      "DB Err.:" & dberrdesc, vbCritical, appnameversion 
    cleanup 
    End 
End If 
spretval = cmd.Parameters("retVal").Value 
MsgBox cmd.Parameters("retVal") 
End Sub 

После выполнения этой процедуры VBA, получение результирующего набора с помощью которых я могу правильно получить заданные значения результата, но НЕ возвращать значение. Я получаю только пустое значение (на самом деле SP возвращает 10)

Хранимая процедура содержит некоторую обработку для вставки данных во временные таблицы и, наконец, возвращает все строки из таблицы temp с помощью команды выбора, а затем возвращает стоимость.

В чем может быть проблема с этим кодом?

ответ

1

Мне удалось получить возвращаемое значение, когда я запросил возвращаемое значение после закрытия объекта набора записей.

По-видимому, недостаточно просто прочитать набор записей; объект набора записей также должен быть закрыт для возвращаемых значений и значений параметров, которые будут заполнены в объекте команды. Я не мог найти это в документации ADO.

Похоже, что это может быть проблема проектирования ADO, что значения возвращаемого значения/значения объекта объекта заполняются только после закрытия объекта набора записей.

Смежные вопросы