【问题标题】:I'm unable to get return value of stored procedure which returns result set as well as return value我无法获得返回结果集以及返回值的存储过程的返回值
【发布时间】:2016-04-15 04:30:40
【问题描述】:

我正在尝试使用 ADODB 2.0 库从 Excel VBA 执行 MSSQL 存储过程(也尝试过 2.8,但存在相同的问题) 它发送结果集以及返回值。我能够正确获取结果集值但无法获取返回值(总是将返回值设为空。)

以下是用于此目的的 VBA 过程,它采用以下参数: db connection, sp name, parameter values string array, db result set, spretval -- 最后两个是out参数

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)

存储过程包含一些处理,将数据插入临时表,最后通过select命令从临时表中返回所有行,然后返回值。

这段代码可能有什么问题?

【问题讨论】:

    标签: sql-server excel vba stored-procedures resultset


    【解决方案1】:

    关闭记录集对象后查询返回值时,我设法得到了返回值。

    显然仅仅完全读取记录​​集是不够的;记录集对象也需要关闭,以便在命令对象中填充返回值和参数值。我在 ADO 文档中找不到这个。

    看起来这可能是一个 ADO 设计问题,即命令对象返回/参数值仅在记录集对象关闭后才被填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多